Java 什么是解引用链偏序?

Java 什么是解引用链偏序?,java,final,java-memory-model,Java,Final,Java Memory Model,我一直在阅读Java8语言规范最后字段的第17.5.1节语义。我无法理解解引用链是什么。 以下是规范中的内容: 对于每次执行,读取行为受两个附加的偏序影响,即解引用链dereferences()和内存链mc(),它们被视为执行的一部分(因此,对于任何特定执行都是固定的)。这些偏序必须满足以下约束(不需要唯一的解决方案): •解引用链:如果动作a是未初始化o的线程t对对象o的字段或元素的读取或写入,则必须存在某个线程t读取的r,该线程t可以看到o的地址,以便r解引用(r,a) •内存链:内存链排序

我一直在阅读Java8语言规范最后字段的第17.5.1节语义。我无法理解解引用链是什么。 以下是规范中的内容:

对于每次执行,读取行为受两个附加的偏序影响,即解引用链dereferences()和内存链mc(),它们被视为执行的一部分(因此,对于任何特定执行都是固定的)。这些偏序必须满足以下约束(不需要唯一的解决方案):

•解引用链:如果动作a是未初始化o的线程t对对象o的字段或元素的读取或写入,则必须存在某个线程t读取的r,该线程t可以看到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)


请帮我理解一下。谢谢。

解引用链只不过是字段的访问路径

例如:

class Foo {

  final Object finalVal;
  Object nonFinalVal;

  Bar(Object val) {
    finalVal = val;
    nonFinalVal = val;
  }
}
给定一个实例
Foo-Foo
,您现在可以通过
Foo.finalVal
Foo.nonFinalVal
取消引用该实例
val
。只有
foo.finalVal
通过最终字段引用,以确保其可见性


因此,在Java内存模型中,读取对象所使用的解引用链是至关重要的,即使读取的对象是相同的。

谢谢您的回答!我已经理解了什么是解引用链,但是你能详细说明一下第一个偏序解引用链吗?非常感谢你。