问题标签 [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.

0 投票
3 回答
9482 浏览

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

我正在阅读文章双重检查锁定和单例模式,关于双重检查锁定如何被破坏,以及 Stack Overflow 上的一些相关问题。

我已经多次使用这种模式/习语,没有任何问题。自从我使用 Java 5 以来,我的第一个想法是 Java 5 内存模型已经纠正了这一点。然而文章说:

本文指的是 Java 5.0 修订前的 Java 内存模型;关于内存排序的陈述可能不再正确。但是,在新的内存模型下,双重检查锁定习语仍然被打破

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

0 投票
5 回答
3859 浏览

c# - 如何使用 Dictionary 的 TryGetValue 显示双重检查锁模式不是线程安全的

最近我看到一些 C# 项目在Dictionary. 像这样的东西:

此代码不正确,因为Dictionary可以在(在锁之外)迭代集合时“增长”_cache.Add()集合_cache.TryGetValue。在许多情况下,这可能是极不可能的,但仍然是错误的。

是否有一个简单的程序来证明此代码失败?

将其合并到单元测试中是否有意义?如果是这样,怎么办?

0 投票
2 回答
746 浏览

objective-c - 双重检查锁定 - 目标 c

我意识到由于内存模型,双重检查锁定在 java 中存在缺陷,但这通常与单例模式和优化单例的创建有关。

在objective-c的这种情况下呢:

我有一个布尔标志来确定我的应用程序是否是流数据。我有 3 种方法,startStreaming、stopStreaming、streamingDataReceived,我使用以下方法保护它们免受多个线程的影响:

这是不必要的双重检查吗?仔细检查在objective-c中是否有与java中类似的问题?这种模式的替代品是什么(反模式)。

谢谢

0 投票
1 回答
988 浏览

c# - 加载可能失败时的线程安全延迟加载

我已经花了大约一个小时来寻找对我想要完成的事情的共识,但还没有在特定方向上找到任何结论性的东西。

我的情况如下:

  • 我有一个多线程应用程序(.NET Web 服务)
  • 我的类使用的对象加载时间不可忽略,所以我想将它们维护为静态类成员
  • 间歇性地构造这些对象的代码失败的可能性很低

我以前使用的方法是在静态构造函数中构造这些对象。问题在于,如上所述,构造函数偶尔会失败,并且一旦 .NET 静态构造函数失败,整个类都会被淹没,直到进程重新启动。这种方法没有第二次机会。

在此之后最直观的方法是使用双重检查锁定。周围有很多页面都在谈论双重检查锁定的弊端,并说要使用静态构造函数,我已经在这样做了,但这对我来说似乎不是一个选择,因为静态构造函数具有可能会失败并拖垮整个班级。

我正在考虑使用的实现(当然是简化的)如下。所有类名和成员名都纯粹是示范性的,而不是我实际使用的。这种方法会不会有问题?任何人都可以提出更好的方法吗?

0 投票
7 回答
718 浏览

c++ - C++ 上的双重检查锁定:临时指针的新对象,然后将其分配给实例

下面的 Singleton 实现有什么问题吗?

0 投票
1 回答
248 浏览

c++ - Maybe (... yeah right) solved: Double checked locking on C++: new to a temp pointer, then assign it to instance

This is a follow up of this post on double checked locking. I am writing a new post because it seems that posting a follow-up on "aged" posts doesn't make it as visible/active as sending out a new post, maybe because most people do not sort posts in stackoverflow by level of activity.

To all who responded, thank you for all your input in the original post. After consulting Joe Duffy's excellent book, "Concurrent Programming on Windows", I am now thinking that I should be using the code below. It's largely identical to the code from his book, except for some variable renamings and the InterlockedXXX line. The following implementation uses:

  1. volatile keyword on both the temp and "actual" pointers to protect against re-ordering from the compiler.
  2. InterlockedCompareExchangePointer to protect against reordering from the CPU.

So, that should be pretty safe (... right?):

0 投票
7 回答
459 浏览

java - 可增长的二项式系数数组的双重检查锁定

我正在尝试使用双重检查锁定来维护一个二项式系数数组,但我最近读到双重检查锁定不起作用。效率非常重要,因此除非仅在条件语句中,否则不能选择使用 volatile。我看不到将静态类与单例对象一起使用的方法(这是框架的一部分,我不知道人们需要使用该函数来处理什么样的数字,所以我无法猜测最大值是多少选择的值将是或是否将使用该函数)。我唯一能想到的就是让一切都不是静态的,并坚持需要使用此方法的每个线程都用自己的数组实例化一个选择对象。看来这应该是不必要的。

0 投票
5 回答
2451 浏览

java - Java synchronized 关键字是否刷新缓存?

仅限 Java 5 及更高版本。假设一台多处理器共享内存计算机(您现在可能正在使用一台)。

以下是单例延迟初始化的代码:

instance必须声明以防止优化器重写getInstance volatile() 如下(这在顺序程序中是正确的):

假设优化器不重写代码,如果instance没有声明volatile,是否仍然保证在退出块时刷新到内存synchronized,并在进入块时从内存中读取synchronized

编辑:我忘了让 getInstance() 静态。我认为这不会改变答案的有效性;你们都知道我的意思。

0 投票
7 回答
2823 浏览

java - 双重检查锁定模式:损坏与否?

为什么模式被认为是损坏的?对我来说看起来不错?有任何想法吗?

0 投票
2 回答
686 浏览

java - Java:如何对数组元素进行双重检查锁定?

这是我的代码目前的样子:

现在我想让它线程安全。我知道Java中的双重检查锁定是“teh 3vilness!!1”,但由于ensureInitialized可能经常被调用,我不希望它被同步。所以我正在考虑这样做:

现在我该怎么做才能使这个真正的线程安全?
一些子问题:

  • 没有必要制作isInitializedvolatile,因为变量没有改变,对吧?
  • 数组元素发生了变化,我怎样才能让它们变得易变?
  • 通常有更好的方法来做到这一点吗?

(还要注意这是一个实例方法,所以静态初始化器将不起作用)