2016-08-03 48 views
0

我有一種情況,一個線程更新int,另一個線程讀取它。所以單讀者單寫作者。 到目前爲止,我使用的是volatile int,但是由於這會強制完全同步內存障礙,所以我在考慮其他的東西。增加int計數器的可見度

一種方法是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更高性能?

感謝

+0

這聽起來像一個非常奇怪的方式就不多說了非常錯誤的,你爲什麼需要這樣做?你的應用程序中是否存在與此有關的性能問題? –

+0

因此,如果讀者讀取舊值,這對您來說不是問題? – Kayaman

+0

不,這不是一個問題,只要在某個點10ms等我會得到正確的結果,即val == visibleCounter – ivenhov

回答

1

如果懶惰增量是你的選擇,我會建議LongAdder之一。 link LongAdder適合多線程更新。

...在高競爭,預計這個類的吞吐量(比AtomicLong)顯著高於

+0

我應該提到。我仍然在Java 1.7上,我不確定更新Long是否比int更高性能 – ivenhov