あるスレッドが int を更新し、ある時点で別のスレッドがそれを読み取る状況があります。だからシングルリーダーシングルライター。これまではvolatile
その目的で int を使用していましたが、これによりメモリ バリアで完全同期が強制されるため、別のことを考えていました。
1つのアプローチは次のようになりますAtomicInteger.incrementAndGet()
が、これはまったく同じ効果があり、実際には遅くなると思います
別のアプローチはAtomicInteger.lazySet
、ライター用の追加の不揮発性カウンターを使用することです。したがって、基本的には
private int counter;
public AtomicInteger visibleCounter = new AtomicInteger();
private void write() {
counter++
visibleCounter.lazySet(counter)
}
// called by reader
public int isCountEqual(int val) {
return val == visibleCounter.get()
}
素朴な「lazyIncrement
」として。
volatile
実際には、ライターによる intの単純なインクリメントよりもパフォーマンスが高いでしょうか?
ありがとう