- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在阅读文章 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/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!