我读过以下经典的著名文章: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/

10-11 03:51