Под AtomicInteger и AtomicIntegerArray обычно используются одни и те же низкоуровневые API для выполнения операций чтения, записи и других операций CAS. (Например, OpenSDK 7 использует sun.misc.Unsafe
для выполнения операций CAS в обоих классах.) Таким образом, при использовании AtomicInteger [] выигрыш в производительности невелик. Как вы уже отметили, использование AtomicIntegerArray имеет существенные преимущества памяти.
Практически, использование последнего освобождает вас от необходимости создавать все ваши экземпляры AtomicInteger. Помните, что вы не можете наивно распределять их лениво по причинам параллелизма; вам придется предварительно выделить или использовать какой-то безопасный механизм публикации. Так что в дополнение к преимуществам памяти, ваш код чище.
Аналогичным образом, если у вас есть группа объектов с членами AtomicInteger, например:
class ReadCounter {
private final String _fileName;
private final AtomicInteger _readCount;
...
}
private final Map<String, ReadCounter> _counterByName = ...;
Тогда вы можете добиться аналогичных улучшений памяти, моделируя переменную-член _readCount
как volatile int
и используя AtomicIntegerFieldUpdater
.