【问题标题】:Volatile variable and synchronized setter and getter [duplicate]易失性变量和同步的设置器和获取器[重复]
【发布时间】:2017-02-27 16:28:48
【问题描述】:

我的线程类有两个变量var1var2,可以从不同的线程访问。我们可以假设通过synchronized getter 和setter 使用var2 与不使用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 并不能替代同步?
  • 二传手的主体背后的想法是什么? return var2 = value; 这是不正常的,所以需要知道你想在那里实现什么。
  • 另外 var1 是一个非最终的公共布尔值,不确定上面是真实的代码还是只是为了演示一个例子,但这可能是个坏消息......
  • 在这个例子中,没有区别。在其他示例中,存在很大差异。您需要阅读 Oracle 并发教程(特别是 docs.oracle.com/javase/tutorial/essential/concurrency/sync.html)以了解同步操作和原子操作之间的区别。

标签: java multithreading synchronized volatile


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    是的,两者在内存可见性方面是等效的。如果你必须做一些检查然后设置,你就会失去synchronized 提供的自动性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 2014-07-03
      • 2015-10-12
      • 2017-08-14
      • 2016-04-04
      • 2014-07-24
      • 2018-08-09
      相关资源
      最近更新 更多