いくつかのことを行い、カウンターなどのいくつかのメトリックを更新する単一のライタースレッドを持つアプリケーションがあります。アプリケーションには、統計を読み取ってそれらを処理する他のスレッドが多数あります。メトリックが最新であることは必須ではありませんが、ライター スレッドがブロックされる時間をできるだけ短くする必要があります。私は、次のうちどれが私のニーズに適しているか疑問に思っていました。
オプション 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();
}
}
それとも、何か他のことをしたほうがいいでしょうか?
前もって感謝します。