问题标签 [double-checked-locking]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - Delphi中应该如何实现“双重检查锁定”?
在 C# 中,以下代码(来自此页面)可用于以线程安全的方式延迟实例化单例类:
什么是等效的线程安全 Delphi 代码?
文章还提到了 Java 中双重检查锁定的两个问题:
- 有可能在帮助器引用指向新创建的对象之前构造了新对象,这意味着创建了两个对象
- 有可能在对象仍在创建时将辅助引用指向内存块,这意味着将返回对不完整对象的引用
因此,虽然上述文章中的 C# 和 Java 版本的代码看起来几乎相同,但只有 C# 版本按预期工作。如果这两个问题也存在于 Delphi 版本的双重检查锁定中,这会导致额外的问题?
php - PHP 线程和同步
我是 PHP 新手,所以开始我决定实现一个单例。
虽然我能够在 php 中重新创建单例模式,但我不确定如何实现双重检查锁定。
这在 PHP 中是否可能/需要。我在某处读到 PHP 不是多线程的?有人可以确认吗?
如果它是多线程的,有人可以向我解释一下 lock() 或 synchronize() 如何在 PHP 中工作吗?
谢谢,亨利
c++ - C++单例实现,双重检查锁定
我听过和读过很多关于 C++ 中的单例实现方法,例如 Meyer、Phoenix 等,但它们在某些使用场景中似乎都有问题。所以我想出了我自己的实现方法,Daniel Singleton。我想知道它是否正确......我认为是,但请告诉我它是否有我没有想到的缺陷!
此外,我试图通过使用双重检查锁定使其成为线程安全的,而不需要一直获取锁,我也读了很多关于它的文章,每个人都说它已经坏了。我也试图解决这个问题,我想知道我的解决方案是否正确......如果不是,那么它怎么会失败?
c++ - 双重检查锁定模式
在C++ and the Perils of Double-Checked Locking中,有作者建议的正确实现模式的伪代码。见下文,
我只是想知道第一个内存屏障是否可以移动到 return 语句的正上方?
编辑:另一个问题:在链接的文章中,正如vidstige 所引用的
从技术上讲,您不需要完全的双向屏障。第一个障碍必须防止 Singleton 的构造向下迁移(通过另一个线程);第二个屏障必须防止 pInstance 的初始化向上迁移。这些被称为“获取”和“释放”操作,并且可能会产生比硬件(例如Itainum)上的完全障碍更好的性能,从而做出区分。
它说第二个屏障不需要是双向的,那么它如何防止对 pInstance 的分配在该屏障之前移动?尽管第一个屏障可以阻止向上迁移,但另一个线程仍然有机会看到未初始化的成员。
编辑:我想我几乎理解第一个障碍的目的。正如sonicoder 所指出的,当 if 返回 true 时,分支预测可能会导致 tmp 为 NULL。为了避免这个问题,必须有一个获取屏障来防止在读取 if 之前读取 tmp 作为返回值。
第一个屏障与第二个屏障配对以实现同步关系,因此可以向下移动。
编辑:对于那些对此问题感兴趣的人,我强烈建议阅读memory-barriers.txt。
java - 初始化可能失败的惰性单例的哪个实现?
想象一下,你有一个静态的无参数方法,它是幂等的并且总是返回相同的值,并且可能会抛出一个检查异常,如下所示:
现在,如果构造返回的 Object 的东西很昂贵并且永远不会改变,那么这对于惰性单例来说是一个很好的候选者。一种选择是 Holder 模式:
不幸的是,这行不通,因为我们不能从(隐式)静态初始化程序块中抛出已检查异常,因此我们可以尝试这样的事情(假设我们希望保留调用者在他们获得已检查异常时的行为)打电话bar()
):
在这一点上,也许双重检查锁定更干净?
DCL 仍然是反模式吗?我在这里是否缺少其他解决方案(也可以使用诸如 racy single check 之类的小变体,但不要从根本上改变解决方案)?有充分的理由选择其中一个吗?
我没有尝试上面的示例,所以它们完全有可能无法编译。
编辑: 我没有重新实现或重新构建这个单例的消费者(即调用者Foo.bar()
)的奢侈,也没有机会引入一个 DI 框架来解决这个问题。我最感兴趣的是在给定约束内解决问题的答案(提供带有已检查异常的单例传播给调用者)。
更新:毕竟我决定使用 DCL,因为它提供了保存现有合同的最干净的方式,并且没有人提供应该避免正确执行 DCL 的具体原因。我没有在接受的答案中使用该方法,因为它似乎只是实现同一目标的一种过于复杂的方法。
java - Synchronization in a HashMap cache
I've got a web application where people ask for resources. This resources are cached using a synchronized hash map for efficiency. The problem here is when two different requests come for the same uncached resource at the same time: the operation retrieving the resources takes up a lot of memory, so I want to avoid calling it more than once for the same resource.
Can somebody please tell me if there is any potential problem with the following snippet? Thanks in advance.
java - Android中的双重检查锁定
根据许多人的说法,除非您运行 1.5 或更高版本并使用volatile
关键字,否则有些常见的 Double-Checked Locking 惯用语在 java 中已被破坏。
一个损坏的双重检查锁示例:
该示例来自这篇文章,该文章还提供了有关如何修复它的详细信息: http ://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
Pugh 的上述分析是针对 Java 虚拟机的。我在 Android 上工作,经常使用采用双重检查锁定的库。dalvik VM 的内存模型是否支持这个习语?
java - 此代码是否解决了 Java 中的双重检查锁定问题?
此代码是否解决了 Java 中的双重检查锁定问题?
有2个方面需要注意:
getInstance()
是不同步的,所以在初始化 INSTANCE 之后,同步是没有成本的createInstance()
是同步的
所以,问题是:这段代码有什么问题吗?它是否合法且始终是线程安全的?
multithreading - C ++ 11中的双重检查锁定模式?
C++11 的新机器模型允许多处理器系统可靠地工作,wrt。对指令进行重组。
正如Meyers 和 Alexandrescu指出的那样,“简单”的双重检查锁定模式实现在 C++03 中并不安全
他们在他们的文章中表明,无论您作为程序员做什么,在 C++03 中,编译器都有太多的自由:允许以一种您无法确定最终只得到一个指令的方式重新排序指令的实例Singleton
。
我现在的问题是:
- 新的 C++11 机器模型的限制/定义现在是否限制了指令序列,即上述代码始终可以与 C++11 编译器一起使用?
- 当使用新的库设施(而不是这里的模拟)时,这个单例模式的安全 C++11 实现现在看起来
Lock
如何?