【问题标题】:Volatile Object working易失性对象工作
【发布时间】:2014-02-14 17:05:26
【问题描述】:

考虑下面的场景,它说如果str 是易失性的,这意味着任何访问str 的线程的任何更新都将直接在主堆栈而不是本地线程缓存上更新。

class A{
  volatile String str;     
  volatile B b=new B();
}

class B{
  int a;
  C c;
}

对于b volatile 对象,场景将如何工作?

我读了几个链接,它说只有引用是易失性的,而不是对象本身的属性,这是什么意思,有人可以帮助我举一些例子,因为我发现它有点难以理解。

如果引用是同步的,那它有什么用,有什么用呢?

【问题讨论】:

    标签: java multithreading volatile


    【解决方案1】:

    第一个场景:

    • 线程 1 执行 a.b = new B();
    • 然后线程 2 执行 B b = a.b;

    在这种情况下,您可以保证第二个线程中b 引用的对象是第一个线程分配给变量的new B()

    第二种情况:

    • 线程 1 执行 a.b.setFoo("hello");
    • 然后线程 2 执行 String s = a.b.getFoo();

    在这种情况下,您无法保证第二个线程中s 的值。它可以是“hello”,也可以是 a.b.foo 的先前值(除非 B 类中的 foo 属性本身是 volatile,或者 setter 和 getter 是同步的)。

    【讨论】:

    • 如果thread 1 重新分配b ref,thread 2 可以读取foo 的最新值吗?例如thread 1:{ a.b.setFoo("Hello"); a.b = a.b; } 然后thread 2:{ a.b.getFoo(); }
    • 对此answer的评论讨论了同一点但不清楚(对我来说:))
    猜你喜欢
    • 2011-06-06
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 2018-01-18
    相关资源
    最近更新 更多