我有一种情况,一个线程更新int,另一个线程在某个时刻读取它。所以单读者单作家。
到目前为止,我正在使用volatile
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 :(得分:1)
如果延迟增量是您的选项之一,我建议LongAdder
。 link
LongAdder
适用于多线程更新。
...在高度争用下,此类的预期吞吐量明显更高(超过
AtomicLong
)