JVM(六)final、顺序一致性

114 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

final字段

声明为 final 的字段初始化一次后,在正常情况下它的值不会再改变。 final 字段也允许编程人员在不需要同步的情况下实现线程安全的不可变对象。一个线程安全的不可变对象被所有线程都视为不可变的,即使不可变对象的引用在线程间传递时存在数据争用。这提供了安全保证,可以防止不正确或恶意代码误用了不可变类。final字段也保证了可见性。

final 字段必须正确使用才能保证不可变。当对象的构造器执行结束,就认为该对象是完全初始化了的。一个线程只有在看到某个对象引用之前,该对象就已经完全初始化了,才能保证这个线程能看到该对象正确初始化的 final 字段值。(构造器不会把初始化一半的对象传递出去,不会发生“this溢出”)

image.png

顺序一致性

顺序一致性是程序执行过程中可见性和顺序的强有力保证。在顺序一致性的执行过程中,所有动作(如读和写)间存在一个全序关系,与程序顺序一致。 每个动作都是原子的且立即对所有线程可见

顺序一致的内存模型 正式地,在顺序一致性里,所有动作以全序(执行顺序)的顺序发生,与程序顺序一致;而且,每个对变量 v 的读操作 r 都将看到写操作 w 写入 v 的值,只要:

 1.执行顺序上 w 在 r 之前,且
 2.执行顺序上不存在这样一个 w’,w 在 w’之前且 w’在 r 之前。

顺序一致性太严格了,不适合做 Java 内存模型,因为它禁止了标准的编译器和处理器优化。

参考资料

JSR规范整理:https://www.iteye.com/blog/manysysy-1046963
JSR133中文版:http://ifeve.com/wp-content/uploads/2014/03/JSR133%E4%B8%AD%E6%96%87%E7%89%881.pdf
JSR133: http://www.cs.umd.edu/~pugh/java/memoryModel/jsr133.pdf
《深入理解Java虚拟机》第12