gpt4 book ai didi

java - 没有同步或 volatile 关键字的延迟初始化

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:20 26 4
gpt4 key购买 nike

前几天 Howard Lewis Ship 发布了一篇名为 "Things I Learned at Hacker Bed and Breakfast" 的博客文章,要点之一是:

A Java instance field that is assigned exactly once via lazy initialization does not have to be synchronized or volatile (as long as you can accept race conditions across threads to assign to the field); this is from Rich Hickey

从表面上看,这似乎与关于跨线程内存更改可见性的公认智慧不一致,如果这在 Java Concurrency in Practice 一书或 Java 语言规范中有所介绍,那么我就错过了它。但这是 HLS 在 Brian Goetz 出席的一次 Activity 中从 Rich Hickey 那里得到的东西,所以看起来一定有一些东西。有人可以解释一下这句话背后的逻辑吗?

最佳答案

这个说法听起来有点含糊。但是,我猜 HLS 指的是当您懒惰地初始化一个实例字段并且不关心多个线程是否多次执行此初始化时的情况。
例如,我可以指向 String 类的 hashCode() 方法:

private int hashCode;

public int hashCode() {
int hash = hashCode;
if (hash == 0) {
if (count == 0) {
return 0;
}
final int end = count + offset;
final char[] chars = value;
for (int i = offset; i < end; ++i) {
hash = 31*hash + chars[i];
}
hashCode = hash;
}
return hash;
}

如您所见,对 hashCode 字段(保存计算字符串哈希的缓存值)的访问未同步,并且该字段未声明为 volatile。任何调用 hashCode() 方法的线程仍然会收到相同的值,尽管 hashCode 字段可能被不同的线程写入多次。

此技术的可用性有限。恕我直言,它主要用于示例中的情况:从其他最终/不可变字段计算的缓存原始/不可变对象(immutable对象),但它在构造函数中的计算是一种矫枉过正。

关于java - 没有同步或 volatile 关键字的延迟初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11051863/

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