0

我有一个线程更新 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”。

它实际上会比volatilewriter 简单地增加 int 更高效吗?

谢谢

4

1 回答 1

1

如果惰性增量是您的选择之一,我会建议LongAdder链接 LongAdder适用于多线程更新。

...在高竞争下,该类的预期吞吐量显着高于(比AtomicLong

于 2016-08-03T12:03:53.040 回答