Подтвердить что ты не робот

AtomicIntegerArray vs AtomicInteger []

Есть ли разница в значении AtomicIntegerArray и AtomicInteger[]? И какой из них быстрее использовать? (единственное, что я заметил, это то, что сначала занимает гораздо меньше места, но это означает, что каждый повтор проверки проверяет границы массива, чтобы это замедлялось?)

Изменить: в сценарии, где массив предварительно инициализирован.

4b9b3361

Ответ 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 могут быть или не быть правильными при доступе из нескольких потоков. Однако синхронизация доступа к самому объекту массива устранит эту проблему.