Immutable对象满足条件
- 对象创建后,其状态就不能修改
- 对象的所有域都是final修饰
- 对象是正确创建的(即在创建过程中没有出现
this
溢出)
Immutable对象是线程安全的,因为其状态不可变,并且只有构造函数控制;
如何安全的发布一个对象
要安全的发布一个对象,需要同时保证对象的引用和对象的状态对其他线程可见, 可以通过以下方式安全的发布:
- 在静态初始化函数中初始化一个对象的引用(保证只初始化一次)
- 将对象的引用由
volatile
修饰,或者保存到AtomicReference
对象中 - 将对象的引用保存到某个正确构造对象的
final
类型域中 - 将对象的引用保存到由锁保护的域中(例如线程安全的集合工具类)
引用:《Java并发编程实战》