Скажем, у меня есть класс с 2-х переменных экземпляра и следующих методов (упрощенных по этому вопросу):Использование AtomicBoolean вместо синхронизированных блоков
private final Object lock = new Object();
private boolean running;
public MyClass() {
synchronized(lock) {
running = false;
}
}
public void methodA() {
synchronized(lock) {
running = true;
}
}
public void methodB() {
synchronized(lock) {
if (!running) {
return;
}
}
}
Я смотрел на этот код, и после прочтения о AtomicBoolean
я подумал, что здесь можно поместиться, особенно после просмотра конструктора MyClass
и methodA
. Однако я не был уверен в том, что methodB
.
Если предположить, что эти методы могут вызываться несколькими потоками, будет следующее поточно-?:
private AtomicBoolean running;
public MyClass() {
running = new AtomicBoolean(false);
}
public void methodA() {
running.set(true);
}
public void methodB() {
if (!running.get()) {
return;
}
}
Будет running.get()
быть гарантировано, чтобы увидеть обновление через running.set(true)
или running.set(false)
из другого потока?
Я не уверен. Если есть несколько читателей и _one_ писатель, то, возможно, _volatile_ гарантии достаточно.Но в тот момент, когда есть несколько авторов, я не уверен, что использование _volatile_ гарантировано. –
Посмотрите на источник AtomicBoolean - это в основном volatile boolean в объекте, если вы не используете методы compareAndSet. Множество авторов не проблема, в любом случае. –
Согласно [this] (http://tutorials.jenkov.com/java-concurrency/volatile.html) (не уверен, насколько это точно), видимо, это нормально, если есть несколько авторов, если новые письменные значения не зависит от предыдущего значения, но как только вам нужно проверить предыдущее значение, установите новый, основанный на предыдущем, а затем «volatile» недостаточно. –