AtomicBoolean против синхронизированного блока, в чем разница

Я пытаюсь понять разницу между двумя следующими блоками кода

AtomicBoolean ab = new AtomicBoolean(false);  

using the following to get and set state. .
ab.get();
ab.set(X);

vs. 

private boolean ab = false;
private final Object myboollock = new Ojbect();

public void setAB(boolean state)
{
    synchronized(myboollock)
     {
          ab = state;
     }
}

public boolean getAB()
{
 synchronized(myboollock)
 {
         return ab;
 }
}

Мне нужно защитить поток логическим значением, вот и все, и в прошлом использовал более поздний метод, но хотел бы начать использовать атомарные объекты, (если) они безопасны?,

2 ответа

Решение

Есть несколько тонких различий, но если смотреть снаружи, два фрагмента кода ведут себя одинаково: если вы вызываете set метод, изменение будет видно другим вызывающим потокам get впоследствии.

Основными отличиями являются:

  • производительность: в зависимости от уровня конкуренции, вы можете получить лучшую производительность с synchronized или же AtomicBoolean
  • атомарность: если на каком-то этапе вы хотите сделать больше, чем просто установить логическое значение, a synchronized блок позволит вам добавлять инструкции атомарно, но AtomicBoolean не будет

Если все, что вы пытаетесь сделать, это получить и установить один boolean значение атомное, тогда да - вы можете использовать AtomicBoolean вместо этого без какой-либо синхронизации.

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

Другие вопросы по тегам