10

インクリメント操作は、ロックなしでは C++ ではアトミックではないことを知っています。

JVM はiinc命令の実装に何らかのロックを追加しますか?

4

6 に答える 6

16

いいえ、ちがいます

  • c の現在の値を取得します。
  • 取得した値を 1 増やします。
  • インクリメントされた値を c に格納します。

原子性とスレッド干渉に関する Java ドキュメント

synchronizedキーワードを使用するかAtomicXXX、スレッド セーフのメソッドを使用する必要があります。

更新

public synchronized void increment() {
    c++;
}

また

AtomicInteger integer = new AtomicInteger(1);
//somewhere else in code
integer.incrementAndGet();

また読む:iincはJavaでアトミックですか?

于 2013-03-08T05:38:16.613 に答える
5

そうではなく、実際の問題を引き起こす可能性があります。このテストは 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問題を解決しないことに注意してください。

于 2013-03-08T05:55:29.867 に答える
2

いいえ、アトミックではありません。バイトコードは他のスレッドとインターリーブされる可能性があります。

于 2013-03-08T05:39:26.433 に答える
0

i++はJavaではアトミックではありません。
使用する方が良いです

AtomicInteger atomic= new AtomicInteger(1);

次のように定義されたメソッドがあります

atomic.getAndDecrement();
atomic.getAndIncrement();
atomic.decrementAndGet();
atomic.incrementAndGet();

上記のメソッドを使用した操作はすべてアトミックになります。

このクラスはjava.util.concurrent.atomicパッケージに含まれています。Java1.5は、スレッドの安全性とスレッドの並行性のために多くの機能を追加しました。

于 2013-03-08T06:32:27.360 に答える