2016-08-03 2 views
0

私は、あるスレッドがintを更新し、あるスレッドがそれを読み取る状況があります。だからシングルリーダのシングルライター。 これまでは、volatile intをその目的のために使用していましたが、これはメモリ障壁に完全な同期を強制するので、私は何かについて考えていました。可視性を持つインクリメントカウンタ

一つのアプローチは、AtomicInteger.incrementAndGet() だろうが、私は、これはまったく同じ効果があり、実際に別のアプローチは、作家のための余分な不揮発性カウンターでAtomicInteger.lazySetを用いることであろう

遅くなると思います。 だから、基本的に、私たちは素朴な " lazyIncrement" として

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() 
} 

を持っているでしょう。

実際には、書き込み者がvolatile intの単純増分よりもパフォーマンスがよいですか?

おかげ

+0

これを実行する必要がない理由これは、非常に間違っていると言うことではない非常に奇妙なアプローチのように聞こえます?アプリケーションに関連するperf問題がありますか? –

+0

読者が古い値を読んでもそれは問題ではありませんか? – Kayaman

+0

いいえ、ある時点では10msなど、問題はありません。正しい結果、つまりval == visibleCounter – ivenhov

答えて

1

怠惰な増分が、私はLongAdderを示唆するだろうあなたの選択肢の一つである場合。 link LongAdderは、複数のスレッドの更新に適しています。

ハイテンションの下で、このクラスの予想スループットは( AtomicLongより)かなり高い

...

+0

私は言及すべきです。私はまだJava 1.7を使用していますが、Longを更新する方がintよりパフォーマンスが良いかどうかはわかりません – ivenhov