У меня есть потребность в счетчике типа long
со следующими требованиями/фактами:
Основанный на этих требованиях, как Вы приняли бы решение реализовать свой счетчик? Как простое long
, как a volatile long
или использование AtomicLong
? Почему?
В данный момент у меня есть a volatile long
но задавался вопросом, будет ли другой подход лучше. Я также увеличиваю свое длинное путем выполнения ++counter
в противоположность counter++
. Это действительно больше эффективно (когда я велся верить в другом месте), потому что нет никакого сделанного присвоения?
Учитывая эти наборы требований, я думаю , что длительность volatile
должна быть достаточной. Счетчик не будет неправильным с не- изменчивым
длинным, но в этом случае читатель может читать устаревшую информацию.
Одна из проблем заключается в том, что чтение и запись в long
не требуется, чтобы был атомарным , в соответствии со спецификацией JVM , если он не объявлен изменчивым
. Это означало бы, что поток чтения может получить в значительной степени фиктивное значение, если он считывает значение, в то время как поток записи обновляет одну часть значения, но не другую.
Разница между ++ counter
и counter ++
вероятно несущественна, поскольку JVM поймет, что значение выражения больше не используется и в этом случае они эквивалентны.
Каковы требования к времени работы вашей программы? Можете ли вы обойтись энергонезависимым int и racy-reads?
10 ^ 4 инкрементов в секунду - это 1 каждые 100 мкс. Эффективность не является проблемой, но атомарность может быть проблемой. У вас может быть 2 его экземпляра, и когда он будет прочитан, если они не равны, прочтите еще раз.