问题标签 [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 投票
1 回答
67 浏览

java - 在Java中扩展一个具有双重检查锁定单例的类

我有这样的课:

在这里,我创建了一个类的实例,在class属性上进行同步。

我的项目中有很多这样的课程。有没有办法创建一个基类来实现该getInstance方法,所以我不需要在我的所有类中保留这个代码?我尝试使用泛型,但没有运气。也许有一个我试图实现的例子?

0 投票
2 回答
178 浏览

java - 是否使用最终变量进行仔细检查

我有为延迟初始化和存储创建不需要线程安全的对象而设计的类。这是代码:

这里final变量tmpRef用于在将创建的对象分配给检查变量之前存储它object。这在测试中有效,但我不能肯定地说它是正确的,并且不会被编译器优化。可以使用这种方法还是object必须将字段声明为volatile

包装类的变体也被认为是行

必须用这个替换:

包装类如下所示:

可以在多线程环境中安全地使用其中一些示例(尤其是具有最终本地字段的变体)吗?

0 投票
1 回答
1827 浏览

java - 使用常规 HashMap 进行双重检查锁定

回到并发。现在很明显,要使double checked locking变量工作,需要将变量声明为volatile. 但是,如果如下使用双重检查锁定会怎样。

为什么它真的必须是ConcurrentHashMap而不是常规的HashMap?所有地图修改都在synchronized块内完成,代码不使用迭代器,因此从技术上讲不应该存在“并发修改”问题。

请避免建议使用putIfAbsent/computeIfAbsent因为我在询问这个概念而不是使用 API :) 除非使用此 API 有助于HashMapvsConcurrentHashMap主题。

2016-12-30 更新

Holger 在下面的评论中回答了这个问题“HashMap.get不会修改结构,但您的调用会修改put。由于get在同步块之外调用,它可以看到put同时发生的操作的不完整状态。” 谢谢!

0 投票
1 回答
44 浏览

java - 为什么要使用双重检查锁定

关于我之前提出的一个问题,

}

为什么要使用第二个实例空检查条件。它可能产生什么影响?

0 投票
2 回答
119 浏览

java - Java双重检查锁定 - 字符串

鉴于strings 包含 final 字段,这是否意味着在双重检查锁定的上下文中不需要声明它们volatile?例如

我以字符串为例,但它应该与声明一些最终字段的其他对象一起使用,对吗?

0 投票
2 回答
117 浏览

java - Java双重检查锁定-初始化方法

考虑这个例子:

在这种情况下 volatile 是必要的吗?

0 投票
1 回答
95 浏览

java - 带两个同步块的 DCL 坏了?

我无法理解A fix that doesn't work下面的代码片段。(我确实阅读了同一页上的解释)。

如果我们有 2 个同步块,这个 DCL 版本是如何损坏的?或者它在 Java5 之后不适用?

0 投票
1 回答
82 浏览

java - 最新的 JMM 是否指定同步块对其他线程是原子的,甚至是异步的?

当我在http://www.javaworld.com/article/2074979/java-concurrency/double-checked-locking--clever--but-broken.html上浏览一篇关于 DOUBLE-CHECKED LOCKING 的文章时 ,我遇到了一条评论它说“应该注意的是,实际上 DCL 可能在某些 JVM 的某些版本上工作——因为很少有 JVM 真正正确地实现了 JMM。”所以我从中推断 JMM 指定同步块是原子的,甚至是块在其他线程中不同步。我对吗?(我尝试阅读oracle网站上的JMM,但是太抽象了,我放弃了。)

0 投票
2 回答
138 浏览

java - 双重锁定检查失败的java代码

注意:我知道在java 5(2004年给出)之前,双重检查锁在java中会失败,即使你在“instance”字段中添加“volatile”。在 java 5 之后,volatile 语义已经适用于双重检查锁。我也知道,如果没有“volatile”,即使在 java5 之后,由于乱序执行,双重检查锁也会失败。但是,我的问题是:如何编写代码来证明(如果没有“易失性”,双重检查锁将失败)???

我读过很多文章说在java中双重检查锁会失败,所以我认为下面的代码试图获取SocketFactory的单例实例会失败(因为“实例”字段不是易失性的):</p>

但是,问题是,如果上面的代码会失败,我该如何证明呢?我试着写下面的代码(我想,如果第 1 行将被重新排序,“实例”引用可能指向一个 SocketFactory 对象,其中“构造”字段为“假”):

但我从未在 txt 文件中看到“假”。那么如何证明双重检查锁会失败呢?

0 投票
2 回答
220 浏览

c++ - 共享指针的双重检查锁定

免责声明:我来自 Java 背景,因此,我不知道 C++(和相关库)的许多内部结构是如何工作的。

我已经阅读了足够多的内容,知道双重检查锁定是邪恶的,单例模式的正确和安全实现需要适当的工具。

我相信以下代码可能不安全,受编译器重新排序和未初始化对象分配的影响,但我不确定我是否遗漏了一些我不了解该语言的内容。

我相信实际代码是在 C++03 下编译的。

这个实现不安全吗?如果是这样,怎么做?