在本教程(link)中关于Java的volatile声明,据说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调用shutdown
而线程B已经调用并且正在运行doWork
,那么线程B似乎会不断锁定执行,因为它是一个循环。这似乎没有给线程A访问布尔值的机会。作为挥发性声明的同步替代,作者想到了什么?
答案 0 :(得分:1)
// do stuff
部分将在同步块之外。例如,代替doWork
进行同步并拥有while (!shutdownRequested)
,您可能会while (!getShutDown())
,其中getShutDown
是返回shutdownRequested
的同步方法。
答案 1 :(得分:0)
这是一种可行的方式:
public void doWork() {
while (true) {
synchronized (this) {
if (shutdownRequested) {
break;
}
}
// do stuff
}
}