共享模型之不可变类

news/2024/5/20 5:47:40 标签: juc

文章目录

  • 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.niftyadmin.cn/n/5247345.html

相关文章

前端打包环境配置步骤

获取node安装包并解压 获取node安装包 wget https://npmmirror.com/mirrors/node/v16.14.0/node-v16.14.0-linux-x64.tar.xz 解压 tar -xvf node-v16.14.0-linux-x64.tar.xz 创建软链接 sudo ln -s 此文件夹的绝对路径/bin/node /usr/local/bin/node,具体执行如下…

【数据结构】面试OJ题——链表

目录 1.移除链表元素 思路: 2.反转链表 思路: 3.链表的中间结点 思路: 4.链表中的倒数第K个结点 思路: 5.合并两个有序链表 思路: 6.链表分割 思路: 7.链表的回文结构 思路: 8.随机链表…

Vue实现待办任务卡片

📑前言 本文主要是【Vue】——Vue实现待办任务卡片的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一句…

vue2 cron表达式组件

vue2 cron表达式组件 1. 先上图 2. 代码目录 3. 直接上代码 &#xff08;组件代码太多&#xff0c;直接上压缩包&#xff0c;解压后直接用&#xff0c;压缩包再博客顶部&#xff09; 4. 使用注&#xff1a;示例代码中使用了element-ui // HomeView.vue<template><…

帮企10合一万能分销商城源码系统 源码开源可二次开发 附带完整的搭建教程

电子商务的普及&#xff0c;越来越多的企业开始涉足网络销售领域。然而&#xff0c;自行开发一套电商平台需要投入大量的时间和资金&#xff0c;对于很多初创企业或缺乏技术能力的企业来说是一个巨大的挑战。此外&#xff0c;由于电子商务领域的竞争激烈&#xff0c;如何降低运…

LV.12 D24 陀螺仪实验 学习笔记

一、陀螺仪实验代码分析 设置GPB_2引脚和GPB_3引脚功能为I2C传输引脚 #include "exynos_4412.h"/****************MPU6050内部寄存器地址****************/#define SMPLRT_DIV 0x19 //陀螺仪采样率&#xff0c;典型值&#xff1a;0x07(125Hz) #define CONFIG 0x1A…

道可云元宇宙每日资讯|青岛市元宇宙领域新产品推介暨产学研对接会举行

道可云元宇宙每日简报&#xff08;2023年12月7日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 青岛市元宇宙领域新产品推介暨产学研对接会举行 为加快推动青岛市元宇宙技术和产业创新&#xff0c;引领下一代互联网发展&#xff0c;青岛市元宇宙领域新产品推介暨…

MakeFile文件分析

代码&#xff1a; # Comment/uncomment the following line to disable/enable debugging #DEBUG yCONFIG_MODULE_SIGn # Add your debugging flag (or not) to CFLAGS ifeq ($(DEBUG),y)DEBFLAGS -O -g -DSHORT_DEBUG -DEXPORT_SYMTAB# "-O" is needed to expand…