一、对象安全构造
(1)在对象构造期间,不要公布this引用
(2)不要隐式地暴露“this”引用
(3)不要从构造函数内启动线程
a)在构造函数中启动线程时,构造函数还未执行完毕,不能保证此对象已经完全构造
b)如果在启动的线程中访问此对象,不能保证访问到的是完全构造好的对象
二、对象安全发布
(1)Java中存在三种对象
a)不变对象:对象状态创建后不能再修改,对象的所有域为final,对象是正确构造的
b)基本不变对象:不满足不变对象的约束,但是初始化后不再变化
c)可变对象:不满足上述不变对象和基本不变对象的约束
(2)安全发布技术
a)即确保对象引用和状态对其他线程正确可见
b)方式
静态初始化器初始化对象引用
将引用存储到volatile域
将引用存储到正确创建对象的final域
将引用存储到由锁正确保护的域
(3)三种对象安全发布方式
a)不变对象:任何形式机制发布
b)基本不变对象:保证安全发布即可
c)可变对象:不仅要保证安全发布,而且要确保对象状态的正确改变(即用锁或其他方式,保证对象状态的正确改变)