gpt4 book ai didi

java - 为什么没有 volatile 的 DCL 对原语有效?

转载 作者:行者123 更新时间:2023-11-30 05:28:41 27 4
gpt4 key购买 nike

免责声明:我不在实际生产代码中使用 DCL - 我只有学术兴趣。

我读过以下著名文章:The "Double-Checked Locking is Broken" Declaration

问题声明(我的愿景):

// Correct multithreaded version
class Foo {
private Helper helper = null;
public synchronized Helper getHelper() {
if (helper == null)
helper = new Helper();
return helper;
}
// other functions and members...
}

假设 thread_1 执行了 helper = new Helper(); 行 另一个线程(thread_2)可能会看到helper链接不为空,但尚未初始化。发生这种情况是因为构造函数调用可能会通过 helper 链接分配重新排序来自thread_2 View 。

但在本文中提到,这种方法适用于 32 位原语。

Although the double-checked locking idiom cannot be used for references to objects, it can work for 32-bit primitive values (e.g., int's or float's). Note that it does not work for long's or double's, since unsynchronized reads/writes of 64-bit primitives are not guaranteed to be atomic.

// Correct Double-Checked Locking for 32-bit primitives
class Foo {
private int cachedHashCode = 0;
public int hashCode() {
int h = cachedHashCode;
if (h == 0)
synchronized(this) {
if (cachedHashCode != 0) return cachedHashCode;
h = computeHashCode();
cachedHashCode = h;
}
return h;
}
// other functions and members...
}

请解释一下为什么它有效?我知道 32 位写入是原子的。

这里局部变量的原因是什么?

最佳答案

“DCL 已损坏”比喻的本质是,使用 DCL 初始化单例对象,线程可以在看到完全初始化状态的对象之前看到对该对象的引用。 DCL 充分同步了引用单例的有效最终全局变量,但无法同步全局引用的单例对象。

在您的示例中,只有全局变量。不存在“它所指的对象”。

关于java - 为什么没有 volatile 的 DCL 对原语有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58012169/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com