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つが値を変更することはめったにない場合、スレッドセーフになるだけでなく、より効率的になるかどうか疑問に思いました。