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

Может ли AtomicInteger заменить синхронизированный?

javadoc для пакета java.util.concurrent.atomic говорит следующее:

Небольшой набор инструментов, который поддержка блокировки без резьбы программирование на отдельные переменные.

Но я не вижу никакого потокобезопасного (синхронизированного или заблокированного) кода внутри любого класса AtomicInteger или AtomicBoolean.

Итак, эти 2 одинаковы:

1.

int i;
synchronized(this){i++;}

2.

AtomicInteger i = new AtomicInteger();
i.getAndIncrement();

Обновить. Спасибо за ответы. Является ли изменчивым, когда я использую AtomicInteger?

4b9b3361

Ответ 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 как изменчивый или нет.