增加int计数器的可见性

时间:2016-08-03 11:45:09

标签: java volatile atomicinteger

我有一种情况,一个线程更新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的简单增量更高效吗?

由于

1 个答案:

答案 0 :(得分:1)

如果延迟增量是您的选项之一,我建议LongAdderlink LongAdder适用于多线程更新。

  

...在高度争用下,此类的预期吞吐量明显更高(超过AtomicLong