AtomicIntegerArray vs AtomicInteger []
Есть ли разница в значении AtomicIntegerArray
и AtomicInteger[]
?
И какой из них быстрее использовать?
(единственное, что я заметил, это то, что сначала занимает гораздо меньше места, но это означает, что каждый повтор проверки проверяет границы массива, чтобы это замедлялось?)
Изменить: в сценарии, где массив предварительно инициализирован.
Ответы
Ответ 1
AtomicInteger[]
потребуется объект для каждого элемента. AtomicIntegerArray
просто требуется объект AtomicIntegerArray
и объект массива. Поэтому используйте последний, если возможно.
Стоимость проверки границ довольно мала даже для обычных массивов. Что может быть значительным, так это то, что доступ к данным в одной и той же строке кэша от нескольких процессоров может вызвать серьезные проблемы с производительностью. Поэтому отдельные объекты, или намеренно избегая близких элементов массива, могут помочь.
Ответ 2
- AtomicInteger [] - массив целых чисел, защищенных потоком.
- AtomicIntegerArray - это поточно-безопасный массив целых чисел.
Ответ 3
Внизу, AtomicInteger и AtomicIntegerArray обычно используют те же API низкого уровня для выполнения операций чтения, записи и других операций CAS. (Например, OpenSDK 7 использует sun.misc.Unsafe
для выполнения операций CAS в обоих классах.) Таким образом, использование AtomicInteger [] невелик. Как вы уже отметили, использование AtomicIntegerArray имеет значительные преимущества в плане памяти.
С практической точки зрения использование последнего освобождает вас от необходимости создавать все экземпляры AtomicInteger. Помните, что вы не можете наивно выделять эти ленивые из-за причин concurrency; вам придется предварительно выделить или использовать какой-либо безопасный механизм публикации. Таким образом, помимо преимуществ памяти, ваш код чище.
В аналогичном ключе, если у вас есть куча объектов с элементами AtomicInteger, например:
class ReadCounter {
private final String _fileName;
private final AtomicInteger _readCount;
...
}
private final Map<String, ReadCounter> _counterByName = ...;
Затем вы можете добиться аналогичных улучшений памяти, моделируя переменную-член _readCount
как volatile int
и используя AtomicIntegerFieldUpdater
.
Ответ 4
Я согласен с первым пунктом Tom Hawin...
AtomicInteger [] потребует объект для каждого элемента. AtomicIntegerArray просто требует объект AtomicIntegerArray и объект массива. Поэтому используйте последний, если возможно.
... но следует также отметить, что AtomicInteger [] не является потокобезопасным. В частности, ссылки массива на отдельные объекты AtomicInteger могут быть или не быть правильными при доступе из нескольких потоков. Однако синхронизация доступа к самому объекту массива устранит эту проблему.