2016-10-12 3 views
0

Почему существует AtomicInteger в DefaultThreadFactoryAtomicInteger в threadDefaultFactory

private static final AtomicInteger poolNumber = new AtomicInteger(1); 

Просто потому, что он увеличивает и стоимость магазина или какой-либо другой причине, а?

ответ

1

Потому что он может увеличиваться атомарно.

Приращение AtomicInteger состоит из трех действий:

  1. Считывание текущего значения
  2. приращением это значение
  3. Сохранение увеличенное значение

Эти три действия выполняются как один атомный операция.

Это означает, что другая нить не сможет вмешиваться, например. между шагами 1 и 2 или между этапами 2 и 3 и испортить счет. Такое поведение делает AtomicInteger безопасным для использования в многопоточных средах.

+0

Если у меня есть ThreadPoolExecutor, в котором я буду давать свой собственный ThreadFactory, я должен использовать AtomicInteger или нет? Прирост его автоматически прекрасен, но есть ли другая причина?/ –

+0

Атомно, а не автоматически. –

+0

Почему фактически ThreadFactory будет загрязнен, когда новое создание потока выполняется одним потоком? Я имею в виду счет. Мы можем сохранить его предыдущее значение и увеличить его. –

0

Это статическое значение увеличивается в конструкторе DefaultThreadFactory. Пользователь может создать экземпляр фабрики в разных потоках и что приращение может быть потеряно, поэтому AtomicInteger делает такой подход поточно-безопасным.

Смежные вопросы