Долго примитивный или AtomicLong для счетчика?

У меня есть потребность в счетчике типа long со следующими требованиями/фактами:

  • Постепенное увеличение счетчика должно занять как можно меньше времени.
  • Счетчик будет только записан в одним потоком.
  • Чтение из счетчика будет сделано в другом потоке.
  • Счетчик будет регулярно увеличиваться (целых несколько тысяч раз в секунду), но будет только прочитан один раз в пять секунд.
  • Точная точность не важна, только общее представление о размере счетчика достаточно хорошо.
  • Счетчик никогда не сбрасывается, постепенно уменьшается.

Основанный на этих требованиях, как Вы приняли бы решение реализовать свой счетчик? Как простое long, как a volatile long или использование AtomicLong? Почему?

В данный момент у меня есть a volatile long но задавался вопросом, будет ли другой подход лучше. Я также увеличиваю свое длинное путем выполнения ++counter в противоположность counter++. Это действительно больше эффективно (когда я велся верить в другом месте), потому что нет никакого сделанного присвоения?

18
задан Rich 13 June 2018 в 13:16
поделиться

3 ответа

Учитывая эти наборы требований, я думаю , что длительность volatile должна быть достаточной. Счетчик не будет неправильным с не- изменчивым длинным, но в этом случае читатель может читать устаревшую информацию.

Одна из проблем заключается в том, что чтение и запись в long не требуется, чтобы был атомарным , в соответствии со спецификацией JVM , если он не объявлен изменчивым . Это означало бы, что поток чтения может получить в значительной степени фиктивное значение, если он считывает значение, в то время как поток записи обновляет одну часть значения, но не другую.

Разница между ++ counter и counter ++ вероятно несущественна, поскольку JVM поймет, что значение выражения больше не используется и в этом случае они эквивалентны.

11
ответ дан 30 November 2019 в 09:18
поделиться

Каковы требования к времени работы вашей программы? Можете ли вы обойтись энергонезависимым int и racy-reads?

0
ответ дан 30 November 2019 в 09:18
поделиться

10 ^ 4 инкрементов в секунду - это 1 каждые 100 мкс. Эффективность не является проблемой, но атомарность может быть проблемой. У вас может быть 2 его экземпляра, и когда он будет прочитан, если они не равны, прочтите еще раз.

0
ответ дан 30 November 2019 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: