当前位置: 首页 > 知识库问答 >
问题:

Volatile保证一个可变对象的安全发布?

廉飞捷
2023-03-14
  • 从静态初始值设定项初始化对象引用
  • 将对它的引用存储到volatile字段或atomicreference
  • 将对它的引用存储到正确构造的对象的最后一个字段
  • 将对它的引用存储到由锁正确保护的字段中。

但是,我对第二个成语感到困惑。因为volatile只能保证引用对另一个线程是可见的,但它没有它所引用的对象构造的同步。那么它如何保证可变对象是正确构造的,构造这个对象的线程是什么,被另一个线程打断了呢?

共有1个答案

曾新立
2023-03-14

我们需要说明构造一个对象并将其赋值给一个volatile变量是在从该变量读取之前发生的。

摘自JLS第17章:

如果x和y是同一线程的动作,并且x按程序顺序在y之前,则hb(x,y)。

 类似资料:
  • 类OneValueCache是不可变的。但是我们可以更改变量缓存的引用。 但我不能理解为什么VolateCachedFactorizer类是线程安全的。 对于两个线程(线程A和线程B),如果线程A和线程B同时到达,那么两个线程A和B都将尝试创建OnEvalueCache。然后线程A到达而线程B同时到达。然后线程A将创建一个,它覆盖threadB创建的值(OneValueChange是不可变的,但是

  • 及其不安全的发布: 可以抛出AssertionError,我同意。作者写道,这是因为不安全的出版,但另一方面没有答案:什么才是正确的出版方式?它们表示了4个安全发布习惯用语,但我不明白,为什么它们会在上面的情况下起作用: 要安全地发布对象,必须同时使对对象的引用和对象的状态对其他线程可见。通过以下方法可以安全地发布构造正确的对象: null 这里是我的第一个问题,谢谢你的帮助!

  • 我的问题是: 项目符号2和3有什么区别?我对方法和方法在对象的安全发布方面的区别感兴趣。 他在第3点中所说的正确构造对象的final field是什么意思?在开始这些项目符号之前,作者已经提到了他们正在讨论一个正确构造的对象(我假定它不会让引用转义)。但是他们为什么要提到正确构造的对象?

  • 问题内容: 在Java中,我知道关键字可以提供变量的可见性。问题是,如果变量是对可变对象的引用,是否还为该对象内部的成员提供可见性? 在下面的示例中,如果多个线程正在访问和更改线程,它是否可以正常工作? 例 问题答案: 这是关于volatile的一些细节的旁注说明。在这里写这个是因为评论太多了。我想举一些例子说明挥发性如何影响可见性,以及在jdk 1.5中如何改变。 给出以下示例代码: 此测试代码

  • volatile修饰的变量在各个线程的工作内存中不存在一致性的问题(在各个线程工作的内存中,volatile修饰的变量也会存在不一致的情况,但是由于每次使用之前都会先刷新主存中的数据到工作内存,执行引擎看不到不一致的情况,因此可以认为不存在不一致的问题),但是java的运算并非原子性的操作,导致volatile在并发下并非是线程安全的。

  • 问题内容: 从实践中的Java并发性书中: 为了安全地发布对象,必须同时使对该对象的引用和该对象的状态对其他线程可见。可以通过以下方式安全地发布正确构造的对象: 从静态初始化程序初始化对象引用 将对它的引用存储到volatile字段或AtomicReference中 将对其的引用存储到正确构造的对象的最终字段中 将对它的引用存储到由 锁适当保护的字段中。 我的问题是: 项目符号点2和3之间有什么区