Java并发--线程安全策略
1 不可变对象 用不可变对象保证线程安全,是相当于不让线程并发,逃避了并发。 不可变对象就是指一个类的实例化对象不可变。比如String类的实例 主要方法有: 将类声明为final 将所有成员声明为 private 对变量不提供 set 方法,将所有可变成员声明为 final,只能赋值一次,通过构造器初始化所有成员,进行深度拷贝 在 get 方法中不直接返回对象本身,而是克隆对象,并返回对象的拷贝。 final关键字 一个类的private方法会隐式的指定为final方法 final还可以修饰方法的参数,表示该参数在方法中使用时不可以修改。 这里需要注意的是,final修饰的引用数据类型中其内部数据还是可以被修改的,比如一个final修饰的map,有数据<1,3>,可以被修改为<1,2>,所以并不是线程安全的。需要进行解决。 Collections.unmodifiableXXX 系列方法,可以解决上述问题 ,它可以将输入的引用对象变为不可变对象,内部也是不可变的 Guava:ImmutableXXX系列方法也可以达到相同的效果 2 线程封闭 把对象封装到一个线程中,只有这一个线程可以看到这个对象,那么这个对象就不用考虑线程安全问题。 下面用例子演示ThreadLocal的使用: 参考博客: 面试官再问你 ThreadLocal,你就这样“怼”回去!