1.不可变对象
不可变对象需要满足的条件
- 对象创建以后其状态就不能改变
- 对象所有域都是final类型
- 对象是正确创建的(在对象创建期间,this引用没有逸出)
final关键字:
- 修饰类:不能被继承
- 修饰方法:
1. 锁定方法不被继承类修改
2. 效率. - 修饰变量:
1. 基本数据类型:值在声明后即确定,不可改;
2. 引用类型变量:在声明时即引用赋值,引向指向不能更改,引用的对象属性可以修改。
Collections.unmodifiableXXX:Collection、List、Set、Map…
属性不可更改,否则抛出异常
private static Map<Integer,Integer> map=new HashMap<>();
static {
map= Collections.unmodifiableMap(map);
}
Guava:ImmutableXXX:Collection、List、Set、Map…
2.线程封闭
- Ad-hoc线程封闭:程序控制实现,最糟糕,忽略
- 堆栈封闭:局部变量,无并发问题
- TreadLocal线程封闭:特别好的封闭方法
private final static ThreadLocal<Long> requestHolder=new ThreadLocal<>();