說我有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)
更新?
我不太確定。如果有多個閱讀器和_一個作家,那麼_volatile_保證就足夠了。但是,現在有多個作家,我不確定是否保證_volatile_的使用。 –
查看AtomicBoolean的來源 - 如果您不使用compareAndSet方法,則它基本上是一個對象中的易失性布爾值。在任何情況下,多個作家都不是問題。 –
根據[this](http://tutorials.jenkov.com/java-concurrency/volatile.html)(不知道它有多準確),顯然如果有多個編寫者,只要新的寫入值不要依賴於以前的值,但只要你需要檢查前一個值,然後根據前一個值設置一個新值,那麼'volatile'是不夠的。 –