0

あるスレッドが 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の単純なインクリメントよりもパフォーマンスが高いでしょうか?

ありがとう

4

1 に答える 1

1

遅延インクリメントがあなたのオプションの1つである場合は、私が提案しLongAdderます. リンク LongAdderは、複数のスレッドの更新に適しています。

... 競合が激しい場合、このクラスの予想スループットは (よりもAtomicLong)大幅に高くなります

于 2016-08-03T12:03:53.040 に答える