私は、あるスレッドが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の単純増分よりもパフォーマンスがよいですか?
おかげ
これを実行する必要がない理由これは、非常に間違っていると言うことではない非常に奇妙なアプローチのように聞こえます?アプリケーションに関連するperf問題がありますか? –
読者が古い値を読んでもそれは問題ではありませんか? – Kayaman
いいえ、ある時点では10msなど、問題はありません。正しい結果、つまりval == visibleCounter – ivenhov