在有关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/

10-10 03:01