У меня есть приложение с одним потоком писателя, который делает некоторые вещи и обновляет некоторые показатели, например. счетчики и т. д. В приложении есть несколько других потоков, которые читают статистику и делают с ними что-то похожее. Не обязательно, чтобы показатели были в актуальном состоянии, но поток писателя должен быть заблокирован как можно меньше времени. Мне было интересно, какие из следующих бы лучше удовлетворить мои потребности:AtomicXXX lazySet для одиночной записи писателя
Вариант 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();
}
}
Или я был бы лучше делать что-то еще?
Заранее спасибо.
Я принял этот ответ, потому что мне нужно сохранить буферизацию/задержку обрабатываемых данных потоком, записывающим статистику до минимума. Спасибо за предложение. – PaddyD