Java 什么是解引用链偏序?
我一直在阅读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)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) •内存链:内存链排序
请帮我理解一下。谢谢。解引用链只不过是字段的访问路径 例如:
class Foo {
final Object finalVal;
Object nonFinalVal;
Bar(Object val) {
finalVal = val;
nonFinalVal = val;
}
}
给定一个实例Foo-Foo
,您现在可以通过Foo.finalVal
和Foo.nonFinalVal
取消引用该实例val
。只有foo.finalVal
通过最终字段引用,以确保其可见性
因此,在Java内存模型中,读取对象所使用的解引用链是至关重要的,即使读取的对象是相同的。谢谢您的回答!我已经理解了什么是解引用链,但是你能详细说明一下第一个偏序解引用链吗?非常感谢你。