2016-10-23 32 views
0

在本教程(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

文章一开始就称'volatile'不是,一般来说,适当正式锁定的替代品。 –

+0

是的,但这个问题是关于如何锁定是使用易失性声明的替代方法。 – H2ONaCl

回答

1

// do stuff部分将位于synchronized块之外。例如,而不是doWork正在同步并具有while (!shutdownRequested),您可能有while (!getShutDown())其中getShutDown是返回​​的同步方法。

0

下面是它可以工作的一种方式:

public void doWork() { 
    while (true) { 
     synchronized (this) { 
      if (shutdownRequested) { 
       break; 
      } 
     } 
     // do stuff 
    } 
}