(AtomicInteger a).addAndGet(-1)
前のコードは常にこの呼び出しの前に実行される、つまり JVM は呼び出しの前後で命令の順序を変更しないと仮定しても安全addAndGet
ですか?
AtomicInteger
はいの場合、同じインスタンスの状態をチェックしている他のスレッド(例: ) は、呼び出しif (a.compareAndSet(0, -1))
前に最初のスレッドが変更したすべてのものを確認すると想定しても安全ですか?addAndGet
(AtomicInteger a).addAndGet(-1)
前のコードは常にこの呼び出しの前に実行される、つまり JVM は呼び出しの前後で命令の順序を変更しないと仮定しても安全addAndGet
ですか?
AtomicInteger
はいの場合、同じインスタンスの状態をチェックしている他のスレッド(例: ) は、呼び出しif (a.compareAndSet(0, -1))
前に最初のスレッドが変更したすべてのものを確認すると想定しても安全ですか?addAndGet
(AtomicInteger a).addAndGet(-1) の前のコードは常にこの呼び出しの前に実行される、つまり、JVM は addAndGet 呼び出しの前後で命令を並べ替えないと仮定しても安全ですか?
はい、そうです。はaddAndGet
揮発性ストア (または同様のもの) を発行するため、その下で他のロードとストアを並べ替えることができません。
編集: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.htmlをリンクしてくれた Soitrios に感謝します。これは、注文の確立があることを示しています。
- get には、揮発性変数を読み取るというメモリ効果があります。
- set には、揮発性変数を書き込む (割り当てる) というメモリ効果があります。
- compareAndSet および getAndIncrement などの他のすべての読み取りおよび更新操作には、揮発性変数の読み取りと書き込みの両方のメモリ効果があります。