simplex++
はアトミック操作ではないことが知られていますが、実際には読み取り-増分-書き込み操作です。そのため、同期する必要があります。しかし、どうget()
ですか?同期する必要があることも読みましたが、誰かが理由を説明してもらえますか?関係を導入してメモリ整合性エラーを回避するにはhappens-before
?get()
複数のスレッドによって頻繁に呼び出され、値がめったに変更されない状況についてはどうでしょうか。synchronized get()
それらを遅くしていませんか?そのシナリオで同期を実現する他の方法はありますか(AtomicIntegerを使用しない)?volatile
キーワードはここで機能しますか?
public class Counter {
private int value;
public synchronized int get() { return value; }
public synchronized int increment() { return ++value; }
public synchronized int decrement() { return --value; }
}
ありがとう!
編集:
はっきりさせておきたい。使用volatile
するということは、そのキーワードを導入し、メソッドで削除することを意味しましsynchronized
たget()
。多くのスレッドが値を読み取っていて、1つが値を変更することはめったにない場合、スレッドセーフになるだけでなく、より効率的になるかどうか疑問に思いました。