同步作为易失性声明的替代

时间:2016-10-23 05:46:13

标签: java volatile

在本教程(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访问布尔值的机会。作为挥发性声明的同步替代,作者想到了什么?

2 个答案:

答案 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
    }
}