インクリメント操作は、ロックなしでは C++ ではアトミックではないことを知っています。
JVM はiinc
命令の実装に何らかのロックを追加しますか?
いいえ、ちがいます
synchronized
キーワードを使用するかAtomicXXX
、スレッド セーフのメソッドを使用する必要があります。
更新:
public synchronized void increment() {
c++;
}
また
AtomicInteger integer = new AtomicInteger(1);
//somewhere else in code
integer.incrementAndGet();
また読む:iincはJavaでアトミックですか?
そうではなく、実際の問題を引き起こす可能性があります。このテストは 200000000 を出力することになっていますが、スレッド干渉のために出力されません
static int n;
public static void main(String[] args) throws InterruptedException {
Runnable r = new Runnable() {
public void run() {
for(int i = 0; i < 100000000; i++) {
n++;
}
}
};
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(n);
}
volatile
問題を解決しないことに注意してください。
いいえ、アトミックではありません。バイトコードは他のスレッドとインターリーブされる可能性があります。
i++はJavaではアトミックではありません。
使用する方が良いです
AtomicInteger atomic= new AtomicInteger(1);
次のように定義されたメソッドがあります
atomic.getAndDecrement();
atomic.getAndIncrement();
atomic.decrementAndGet();
atomic.incrementAndGet();
上記のメソッドを使用した操作はすべてアトミックになります。
このクラスはjava.util.concurrent.atomic
パッケージに含まれています。Java1.5
は、スレッドの安全性とスレッドの並行性のために多くの機能を追加しました。