Может ли AtomicInteger заменить синхронизированный?
javadoc для пакета java.util.concurrent.atomic говорит следующее:
Небольшой набор инструментов, который поддержка блокировки без резьбы программирование на отдельные переменные.
Но я не вижу никакого потокобезопасного (синхронизированного или заблокированного) кода внутри любого класса AtomicInteger или AtomicBoolean.
Итак, эти 2 одинаковы:
1.
int i;
synchronized(this){i++;}
2.
AtomicInteger i = new AtomicInteger();
i.getAndIncrement();
Обновить. Спасибо за ответы. Является ли изменчивым, когда я использую AtomicInteger?
Ответы
Ответ 1
Они предложили бы такую же атомарность. Единственное, о чем вы должны знать, это когда вы читаете, вы также должны обернуть его синхронизированным.
synchronized(this){ return i;}
Отредактируйте ответ на свое редактирование:
Для вашего AtomicInteger не требуется летучесть. Чтобы доказать, что объявили окончательный выпуск AtomicInteger. Единственная причина, по которой вам понадобится AtomicInteger, быть изменчивой, - это изменение поля AtomicInteger. Похоже на:
volatile AtomicInteger i = new AtomicInteger(0);
public void work(){
i.incrementAndGet();
//...do some other stuff
i = new AtomicInteger(10);//because the field i is changing the field needs to be volatile
}
Как вы можете себе представить, это не должно быть так, поэтому вам не придется беспокоиться о том, что поле нестабильно.
Ответ 2
Они эквивалентны функционально, но есть тонкая разница. synchronized
имеет накладные расходы на получение и освобождение монитора на this
, а AtomicInteger
реализуется с помощью вызова метода native, поэтому он будет значительно быстрее.
Ответ 3
Да, они функционально эквивалентны.
Если вы находитесь в сверхвысокой конкурентной среде, вы можете увидеть разницу в производительности, но это маловероятно.
Ответ 4
AtomicInteger использует sun.misc.Unsafe для выполнения атомных обновлений.
Итак, в ответ на ваш вопрос, да, AtomicInteger является потокобезопасным.
Ответ 5
Является ли изменчивым, когда я использую AtomicInteger?
Не обязательно. Учитывая ваш пример:
- если
i
- локальная переменная или
- если
i
является атрибутом final
или
- если текущий поток и поток, который инициализировал (или последний раз обновлял) переменную
i
, синхронизировались после этого события,
тогда не имеет значения, объявляете ли вы i
как изменчивый или нет.