易失性变量和同步设定器和吸气剂

时间:2016-10-18 11:53:38

标签: java multithreading synchronized volatile

我的线程类有两个变量var1var2,可以从不同的线程访问。我们可以假设使用var2通过synchronized getter和setter与使用volatile var1而不使用它们相同吗?

public class Processor extends Thread
{
    public volatile  boolean var1 = false
    private boolean var2 = false

    synchronized boolean getVar2 ()
    {
        return var2;
    }

    synchronized boolean setVar2 (boolean value)
    {
        return var2=value;
    }


    public void run()
    {
        ...
    }
}

2 个答案:

答案 0 :(得分:2)

在这种情况下是的。因为synchronized块都不会读取和写入值。

假设我们想要对值更改做出反应,这需要读取当前值和写入新值。为此,volatile不合适:

synchronized void setVar(boolean value) {
  if (var != value) {
    var = value;
    someOnChangeMethod();
  }
}

答案 1 :(得分:1)

是的,两者相当于内存可见性。如果你必须做一些检查然后设置,你将失去synchronized提供的自动性。