This question already has answers here:
Difference between volatile and synchronized in Java
                                
                                    (4个答案)
                                
                        
                3年前关闭。
            
        

我有一个具有两个变量var1var2的线程类,可以从不同的线程访问它们。我们是否可以假设通过var2 getter和setter使用synchronized就像使用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()
    {
        ...
    }
}

最佳答案

在这种情况下,是的。因为这两个同步块都不读取和写入值。

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

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

关于java - 易变变量和同步的setter和getter ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40107553/

10-11 22:51
查看更多