我一直在阅读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)。
请帮我解释一下。谢谢。
答案 0 :(得分:1)
解除引用链只不过是一个字段的访问路径。
例如:
class Foo {
final Object finalVal;
Object nonFinalVal;
Bar(Object val) {
finalVal = val;
nonFinalVal = val;
}
}
鉴于实例Foo foo
,您现在可以通过val
和foo.finalVal
取消引用实例foo.nonFinalVal
。只有foo.finalVal
通过最终字段引用才能保证其可见性。
因此,在Java内存模型中,即使读取对象相同,也必须使用解除引用链来读取对象。