在有关Java的volatile声明的本教程(link)中,据说volatile声明可以替代同步。
作者使用volatile声明的示例:
volatile boolean shutdownRequested;
...
public void shutdown() { shutdownRequested = true; }
public void doWork() {
while (!shutdownRequested) {
// do stuff
}
}
我对同步的幼稚实现是:
volatile boolean shutdownRequested;
...
synchronized public void shutdown() { shutdownRequested = true; }
synchronized public void doWork() {
while (!shutdownRequested) {
// do stuff
}
}
似乎如果线程A在线程B已经调用并正在运行
shutdown
的同时调用doWork
,则似乎线程B将不断锁定执行,因为这是一个循环。这似乎没有给线程A访问布尔值的机会。作为可变声明的同步替代方案,作者想到了什么? 最佳答案
// do stuff
部分将在同步块之外。例如,您可能有doWork
,而不是同步while (!shutdownRequested)
并使其具有while (!getShutDown())
,其中getShutDown
是返回shutdownRequested
的同步方法。
关于java - 同步作为 volatile 声明的替代方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40199967/