问题标签 [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.
java - 在Java中扩展一个具有双重检查锁定单例的类
我有这样的课:
在这里,我创建了一个类的实例,在class
属性上进行同步。
我的项目中有很多这样的课程。有没有办法创建一个基类来实现该getInstance
方法,所以我不需要在我的所有类中保留这个代码?我尝试使用泛型,但没有运气。也许有一个我试图实现的例子?
java - 是否使用最终变量进行仔细检查
我有为延迟初始化和存储创建不需要线程安全的对象而设计的类。这是代码:
这里final
变量tmpRef
用于在将创建的对象分配给检查变量之前存储它object
。这在测试中有效,但我不能肯定地说它是正确的,并且不会被编译器优化。可以使用这种方法还是object
必须将字段声明为volatile
?
包装类的变体也被认为是行
必须用这个替换:
包装类如下所示:
可以在多线程环境中安全地使用其中一些示例(尤其是具有最终本地字段的变体)吗?
java - 使用常规 HashMap 进行双重检查锁定
回到并发。现在很明显,要使double checked locking
变量工作,需要将变量声明为volatile
. 但是,如果如下使用双重检查锁定会怎样。
为什么它真的必须是ConcurrentHashMap而不是常规的HashMap?所有地图修改都在synchronized
块内完成,代码不使用迭代器,因此从技术上讲不应该存在“并发修改”问题。
请避免建议使用putIfAbsent
/computeIfAbsent
因为我在询问这个概念而不是使用 API :) 除非使用此 API 有助于HashMap
vsConcurrentHashMap
主题。
2016-12-30 更新
Holger 在下面的评论中回答了这个问题“HashMap.get
不会修改结构,但您的调用会修改put
。由于get
在同步块之外调用,它可以看到put
同时发生的操作的不完整状态。” 谢谢!
java - Java双重检查锁定 - 字符串
鉴于string
s 包含 final 字段,这是否意味着在双重检查锁定的上下文中不需要声明它们volatile
?例如
我以字符串为例,但它应该与声明一些最终字段的其他对象一起使用,对吗?
java - Java双重检查锁定-初始化方法
考虑这个例子:
在这种情况下 volatile 是必要的吗?
java - 带两个同步块的 DCL 坏了?
我无法理解A fix that doesn't work下面的代码片段。(我确实阅读了同一页上的解释)。
如果我们有 2 个同步块,这个 DCL 版本是如何损坏的?或者它在 Java5 之后不适用?
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,但是太抽象了,我放弃了。)
java - 双重锁定检查失败的java代码
注意:我知道在java 5(2004年给出)之前,双重检查锁在java中会失败,即使你在“instance”字段中添加“volatile”。在 java 5 之后,volatile 语义已经适用于双重检查锁。我也知道,如果没有“volatile”,即使在 java5 之后,由于乱序执行,双重检查锁也会失败。但是,我的问题是:如何编写代码来证明(如果没有“易失性”,双重检查锁将失败)???
我读过很多文章说在java中双重检查锁会失败,所以我认为下面的代码试图获取SocketFactory的单例实例会失败(因为“实例”字段不是易失性的):</p>
但是,问题是,如果上面的代码会失败,我该如何证明呢?我试着写下面的代码(我想,如果第 1 行将被重新排序,“实例”引用可能指向一个 SocketFactory 对象,其中“构造”字段为“假”):
但我从未在 txt 文件中看到“假”。那么如何证明双重检查锁会失败呢?
c++ - 共享指针的双重检查锁定
免责声明:我来自 Java 背景,因此,我不知道 C++(和相关库)的许多内部结构是如何工作的。
我已经阅读了足够多的内容,知道双重检查锁定是邪恶的,单例模式的正确和安全实现需要适当的工具。
我相信以下代码可能不安全,受编译器重新排序和未初始化对象分配的影响,但我不确定我是否遗漏了一些我不了解该语言的内容。
我相信实际代码是在 C++03 下编译的。
这个实现不安全吗?如果是这样,怎么做?