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
это общая альтернатива синхронизации - но в этом случае вы можете использовать ее вместо синхронизации.