我读过以下经典的著名文章:The "Double-Checked Locking is Broken" Declaration
我有一个问题:
实际上,假设computeHashCode函数始终返回
结果相同且没有副作用(即幂等),您可以
甚至摆脱所有同步。
// Lazy initialization 32-bit primitives
// Thread-safe if computeHashCode is idempotent
class Foo {
private int cachedHashCode = 0;
public int hashCode() {
int h = cachedHashCode;
if (h == 0) {
h = computeHashCode();
cachedHashCode = h;
}
return h;
}
// other functions and members...
}
本文是针对Java 4编写的。它对于Java 8+仍然有效吗?
确实
computeHashCode()
仅被调用一次? 最佳答案
不,它可以多次执行。同步会将更改“散布”到其他线程,如果没有它,则在一个线程中所做的更改理论上将永远无法在该线程外进行通信。
但是,本文并没有说computeHashCode
会被精确地调用一次,只是竞争条件不会引起任何问题。 int
写入保证是原子的,并且computeHashCode
是幂等的(这要求类及其字段有效地为最终值),您将只覆盖具有相同值的先前值,因此不会发生任何不良情况。
关于java - 如果使用32位原语和函数幂等,为什么我可以跳过DCL的任何同步?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58013534/