AtomicIntegerArray vs AtomicInteger [] - PullRequest
       11

AtomicIntegerArray vs AtomicInteger []

14 голосов
/ 28 марта 2009

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

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

Ответы [ 4 ]

9 голосов
/ 28 марта 2009

AtomicInteger[] потребует объекта на элемент. AtomicIntegerArray просто требует объект AtomicIntegerArray и объект массива. Так что используйте последний, если это возможно.

Стоимость проверки границ довольно мала даже для обычных массивов. Что может быть важным, так это то, что доступ к данным в одной строке кэша с нескольких процессоров может вызвать значительные проблемы с производительностью. Поэтому отдельные объекты или намеренное избегание близких элементов массива могут помочь.

5 голосов
/ 28 марта 2009
  • AtomicInteger [] - массив целочисленных потоковых целых.
  • AtomicIntegerArray - это потокобезопасный массив целых чисел.
2 голосов
/ 28 марта 2009

Под 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.

0 голосов
/ 28 марта 2009

Я согласен с первым абзацем Тома Хоуина ...

AtomicInteger [] потребует объект для каждого элемента. AtomicIntegerArray просто требует объект AtomicIntegerArray и объект массива. Так что используйте последний, если это возможно.

... но следует также отметить, что AtomicInteger [] не является потокобезопасным. В частности, ссылки массива на отдельные объекты AtomicInteger могут быть или не быть правильными, если доступ осуществляется из нескольких потоков. Однако синхронизация доступа к самому объекту массива устранит эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...