只要发布了,没有发生对象逸出的,就是线程安全的。
不可变对象需满足的条件:
- 对象创建以后其状态就不能修改;
- 对象所有域都是final类型;
- 对象正确创建(对象创建期间,this引用没有发生逸出)
不可变对象是线程安全的,因为不可修改;
将不会修改的对象,设计成不可修改的类对象,让对象在多个线程间线程安全。
创建不可变对象的方法:
final关键字:
- 修饰类:不能被继承,eg:String
- 修饰方法:锁定方法不能被继承类修改;(private修饰的方法 隐式的为final)
- 修改变量:基本数据类型变量(不允许修改值)、引用类型变量(不允许修改指向的地址,但对象里的值可以修改);
工具类:
- Collections.unmodifiableXXX : Collection、List、Set、Map;
- Guava:ImmutableXXX: Collection、List、Set、Map