-
对于含有final域的对象, 初始化安全性可以防止对对象的初始引用被重排序到构造过程之前。
当构造函数完成时, 构造函数对final域的所有写入操作, __以及对通过这些域可以到达的任何变量__的写入操作都将被冻结, 并且任何获得该对象引用的线程都至少能确保看到被冻结的值。
@ThreadSafe public class SafeStates { private final Map<String, String> states; public SafeStates() { states = new HashMap<String, String>(); states.put("alaska", "AK"); states.put("alabama", "AL"); states.put("wyoming", "WY"); } public String getAbbreviation(String s) { return states.get(s); } }
-
初始化安全性只能保证通过final域可达的值从构造完成时开始的可见性。
对于通过非final域可达的值, 或者再构成过程完成后可能改变的值, 必须采用同步来确保可见性。
chapter16_Java内存模型_3_初始化过程中的安全性
最新推荐文章于 2019-04-01 17:22:18 发布