我有一个带有单个编写器线程的应用程序,它执行一些操作并更新一些指标,例如计数器等。该应用程序有许多其他线程,它们读取统计信息并使用它们做一些事情。指标是否是最新的并不重要,但编写器线程需要被阻塞的时间越短越好。我想知道以下哪个更适合我的需求:
选项 1 - 有一个只有作者可以更新的非原子字段,以及一个使用以下设置的 AtomicXXX 字段lazySet
:
class Stats1
{
private final AtomicLong someCounterAtomic = new AtomicLong(0);
private long someCounter = 0;
// writer thread updates the stats using this
public void incrementCounter(long counterIncrement)
{
someCounter += counterIncrement;
someCounterAtomic.lazySet(someCounter);
}
// reader threads call this
public long getCounterValue()
{
return someCounterAtomic.get();
}
}
选项 2 - 只需有一个 AtomicXXX 字段,该字段通过以下方式更新addAndGet
:
class Stats2
{
private final AtomicLong someCounter = new AtomicLong(0);
// writer thread updates the stats using this
public void incrementCounter(long counterIncrement)
{
someCounter.addAndGet(counterIncrement);
}
// reader threads call this
public long getCounterValue()
{
return someCounter.get();
}
}
还是我做其他事情会更好?
提前致谢。