当前位置: 首页 > article >正文

共享模型之不可变类

文章目录

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

http://www.kler.cn/a/162217.html

相关文章:

  • Webkit 滚动条样式属性
  • goframe开发一个企业网站 验证码17
  • 深度学习中的感受野:从基础概念到多层次特征提取
  • 三维测量与建模笔记 - 特征提取与匹配 - 4.2 梯度算子、Canny边缘检测、霍夫变换直线检测
  • Window下PHP安装最新sg11(php5.3-php8.3)
  • vue2.7.14 + vant + vue cli脚手架转vite启动运行问题记录
  • 基于ssm实验室课程管理系统源码和论文
  • 万宾科技智能水环境综合治理监测系统效果
  • ElasticSearch中的分析器是什么?
  • 图像的均方差和信噪比计算
  • 模块电源(六):前馈电容
  • CSS中 设置文字下划线 的几种方法
  • 【LeetCode】202. 快乐数
  • crmeb本地开发配置代理
  • 过滤器Filter实现及执行顺序
  • 销售技巧培训之如何提高手机销售技巧
  • 机器学习应用 | 使用 MATLAB 进行异常检测(下)
  • 销售技巧培训之如何提升顾问式销售技巧
  • 传世SUN引擎如何安装
  • RabbitMq整合Springboot超全实战案例+图文演示+源码自取
  • MacBook 逆水寒下载安装使用教程,支持最新版本 MacOS 流畅不闪退
  • 如何解压没有密码的7-zip文件?
  • 如何解决5G基站高能耗问题?
  • 工业机器视觉megauging(向光有光)使用说明书(二,轻量级的visionpro)
  • 柏林噪声C++
  • 小白学java栈的经典算法问题——第四关白银挑战