什么是Dereference Chain部分排序?

时间:2018-01-07 13:19:37

标签: java final java-memory-model

我一直在阅读17.5.1 Java8语言规范的最终字段的语义。我无法理解Dereference Chain是什么。 以下是规范中的内容:

  

对于每次执行,读取的行为受到两个额外的部分顺序的影响,即dereference链dereferences()和内存链mc(),它们被认为是执行的一部分(因此,对于任何特定的部分都是固定的执行)。这些部分订单必须满足以下约束条件(不需要具有唯一解决方案):

     

•解引用链:如果一个动作a是一个字段或一个对象的元素的读取或写入的一个线程t没有初始化o,那么必须存在一些线程t的读取r,它们看到的是o使得r解除引用(r,a)。

     

•内存链:内存链排序有几个限制:    - 如果r是看到写w的读数,则必须是mc(w,r)的情况。    - 如果r和a是解除引用(r,a)的动作,则必须是mc(r,a)的情况。    - 如果w是一个没有初始化o的线程t写入对象o的地址,那么必须存在一些线程t读取r,它看到o的地址,使得mc(r,w)。

请帮我解释一下。谢谢。

1 个答案:

答案 0 :(得分:1)

解除引用链只不过是一个字段的访问路径。

例如:

class Foo {

  final Object finalVal;
  Object nonFinalVal;

  Bar(Object val) {
    finalVal = val;
    nonFinalVal = val;
  }
}

鉴于实例Foo foo,您现在可以通过valfoo.finalVal取消引用实例foo.nonFinalVal。只有foo.finalVal通过最终字段引用才能保证其可见性。

因此,在Java内存模型中,即使读取对象相同,也必须使用解除引用链来读取对象。