gpt4 book ai didi

java - 真实世界 Java 应用程序中的单例模式和损坏的双重检查锁定

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:11:40 28 4
gpt4 key购买 nike

我正在阅读文章 Double-checked locking and the Singleton pattern ,关于如何破坏双重检查锁定,以及 Stack Overflow 上的一些相关问题。

我已经多次使用这个模式/习语,没有任何问题。由于我一直在使用 Java 5,我的第一个想法是这已在 Java 5 内存模型中得到纠正。但是文章说:

This article refers to the Java Memory Model before it was revised for Java 5.0; statements about memory ordering may no longer be correct. However, the double-checked locking idiom is still broken under the new memory model.

这是一个真正的问题吗?如果是,在什么条件下?

最佳答案

关于双重检查锁定的单例示例,看起来很聪明但已损坏

同步块(synchronized block)的开始保证你看到最新的数据,但它不保证重新排序,你不能期望一致的数据 View ,除非你也在同步块(synchronized block)中。它不保证在同步部分中完成的变量修改对其他线程可见。只有进入同步块(synchronized block)的线程才能保证看到更改。这就是双重检查锁定被破坏的原因——它在读者端不同步。 读取线程可能会看到,单例不为空,但单例数据可能未完全初始化(可见)

另一方面,排序由 volatile 提供,它保证排序,例如写入 volatile 单例静态字段保证对单例对象的写入将在写入 volatile 静态字段之前完成。它不会阻止创建两个对象的单例;这是由 synchronize 提供的。类最终静态字段不需要是 volatile 的。在 Java 中,JVM 会处理这个问题。

可以在以下位置找到更多内容:

关于java - 真实世界 Java 应用程序中的单例模式和损坏的双重检查锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2482092/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com