-
写final域重排序规则:final域的写禁止排序到构造函数之外,JVM会在构造函数return之前,final域初始化之后插入storestore屏障,而非final域的写入有可能被JVM重排序到构造函数之外。
以上规则可以保证:在对象的引用被任意线程可见之前,对象的final域已经被正确初始化过了,而非final域不具备这个保障。 - 读final域重排序规则:JVM禁止将初次读一个对象的final域的值重排序到初次获得该对象的引用之前,保证先获得该对象引用,才能读取final域的值,两者之间会插入loadload屏障,而非final域不具备这个保障。
- 若final域为引用类型:此时JVM会增加一条约束,构造函数中final域引用对象的成员的写入,不能与构造函数的return语句重排序,构造函数外则没有这样的保障。
- 注意final引用不能从构造函数中“溢出”,存在线程安全问题。
网友评论