AtomicIntegerArray vs AtomicInteger []

Согласно вашему коду:

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i<=name.length; i++) {
  System.out.print(name[i] +'\n');
}

Если вы проверите System.out.print (name.length),

, вы получите 3;

, что означает, что длина вашего имени равна 3

, ваш цикл работает от 0 до 3, который должен работать либо от «0 до 2», либо от «1 до 3»

Ответ

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i<name.length; i++) {
  System.out.print(name[i] +'\n');
}
14
задан Sarmun 28 March 2009 в 17:29
поделиться

4 ответа

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

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

9
ответ дан 1 December 2019 в 13:59
поделиться
  • AtomicInteger [] является массивом ориентированных на многопотоковое исполнение целых чисел.
  • AtomicIntegerArray является ориентированным на многопотоковое исполнение массивом целых чисел.
5
ответ дан 1 December 2019 в 13:59
поделиться

Я соглашаюсь с первым абзацем Tom Hawin...

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

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

0
ответ дан 1 December 2019 в 13:59
поделиться

Внизу, 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 как a volatile int и использование AtomicIntegerFieldUpdater.

2
ответ дан 1 December 2019 в 13:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: