共享模型之不可变类

2023-12-14 08:44:23

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 设置成员变量,这种没有任何成员变量的类是线程安全
  • 因为成员变量保存的数据也可以称为状态信息,因此没有成员变量就称之为【无状态

文章来源:https://blog.csdn.net/qq_51240148/article/details/134875043
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。