共享模型之不可变类
文章目录
- 1. 不可变类的使用
- 2. 不可变类设计
- 2.1 不可变类关联设计模式:享元模式
- 2.2 final 原理:写屏障
- 3. 无状态类设计
1. 不可变类的使用
SimpleDateFormat 不是线程安全的
解决:
- 思路 - 同步锁:这样虽能解决问题,但带来的是性能上的损失,并不算很好:
- 思路 - 不可变:DateTimeFormatter。如果一个对象不能够修改其内部状态
(属性)
,那么它就是线程安全
的,因为不存在并发修改
啊!
2. 不可变类设计
String 类也是不可变的,以它为例,说明一下不可变设计的要素
口述:类上用final表示不可继承,就能很好的保护内部方法,char数组final修饰,那之后的操作它的引用不会变,但可能对数组内部值还能修改,String的话它没有提供修改的方法,只要涉及到修改char数组了,都会copy拷贝到另一个数组,再吧拷贝好的数组引用赋值,其实就是创建了一个新的对象,之所以这样,你涉及到改了我就new,躲线程下肯定也是安全的,不涉及到共享变量了,也不能说不涉及到共享变量,也涉及,就是char数组,但是操作都是读操作,没有改操作,自然就线程安全了,所以String是不可变的,线程安全的。
特别说明:不可变类在多线程环境下,针对某一个具体方法来说是线程安全的,但是:当多个方法的组合时,因为不能保证多个方法的原子操作,会存在线程安全问题,
这里Private final char value[],只能保证数组的引用地址不变,但可不能保证里面的元素不可变哦!!!
2.1 不可变类关联设计模式:享元模式
针对不可变类,每次修改都要new,会导致创建得对象太多,吧常用得缓存起来,我提前都创建好,如果在这个范围内的话,你直接取,不用再创建新对象了。
2.2 final 原理:写屏障
3. 无状态类设计
- 在 web 阶段学习时,设计
Servlet
时为了保证其线程安全,都会有这样的建议,不要为 Servlet 设置成员变量
,这种没有任何成员变量的类是线程安全
的 - 因为成员变量保存的数据也可以称为状态信息,因此没有成员变量就称之为【无状态