共享模型之不可变

前言

该文章后续还需要进行修改!!


不可变的解释是对象属性不可以更改。

在多线程下,格式转化使用SimpleDateFormat可能会报错。这是因为线程之间互相影响导致。

public class test {public static void main(String[] args) {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");for (int i = 0; i < 10; i++) {new Thread(()->{try {Date parse = simpleDateFormat.parse("2003-6-03");System.out.println(parse);} catch (ParseException e) {e.printStackTrace();}}).start();}}
}

多线程下安全格式转化

public class test {public static void main(String[] args) {DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");for (int i = 0; i < 10; i++) {new Thread(()->{try {TemporalAccessor parse = dateTimeFormatter.parse("2003-06-03");System.out.println(parse);} catch (Exception e) {e.printStackTrace();}}).start();}}
}

不可变类的设计

以String为例

值使用char数组存储。hash是用来存储哈希值,第一次调用hashCode时存储在hash中做缓存。

  • 属性使用final保证属性是只读,不可以发生更改
  • 类使用final保证方法不能被覆盖,避免子类破坏不可变性

保护性拷贝

public String(char value[]) {this.value = Arrays.copyOf(value, value.length);}

这是String类中的构造方法。对于char数组,如果value引用参数地址的话,当外部char数组发生改变时,String对象中的值也跟着改变。因此要拷贝出一样的char数组让value来引用拷贝出来的地址。

类似于String类容易频繁创建对象,这时通常会用享元模式来减少对象的创建。JDK使用了享元模式的源码解析

DIY一个连接池

连接池作用是可以避免在高并发的情况下反复建立连接浪费系统性能,实现连接复用。基于享元模式实现的。

class Test{public static void main(String[] args) {pool pool = new pool(3);for (int i = 0; i < 5; i++) {new Thread(()->{Connection connect = pool.getConnect();try {Thread.sleep(new Random().nextInt(1000));} catch (InterruptedException e) {e.printStackTrace();}pool.freeConnect(connect);}).start();}}
}public class pool {//连接池大小private final int poolSize;//连接对象数组private Connection[] connections;//连接对象状态 0表示空闲。1是繁忙private AtomicIntegerArray states;public pool(int poolSize) {this.poolSize = poolSize;this.connections = new Connection[poolSize];this.states = new AtomicIntegerArray(new int[poolSize]);for (int i = 0; i < poolSize; i++) {connections[i] = new MyConnect("nameIs"+i);}}//获取连接public Connection getConnect(){while (true){for (int i = 0; i < poolSize; i++) {if (states.get(i)==0){if (states.compareAndSet(i,0,1)){System.out.println("获取连接"+connections[i]);return connections[i];}}}//如果没有空闲连接synchronized (this){try {System.out.println("没有空闲连接");this.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}//释放连接public void freeConnect(Connection connection){//判断传过来的连接是否是连接池中的。for (int i = 0; i < poolSize; i++) {if (connections[i]==connection){//因为只有一个线程拿到该连接,因此不会发生线程安全问题,直接使用set即可states.set(i,0);System.out.println("释放连接:"+connection);synchronized (this){this.notifyAll();}break;}}}
}

获取连接MyConnect{name='nameIs0'}

获取连接MyConnect{name='nameIs1'}

没有空闲连接

获取连接MyConnect{name='nameIs2'}

没有空闲连接

释放连接:MyConnect{name='nameIs0'}

获取连接MyConnect{name='nameIs0'}

没有空闲连接

释放连接:MyConnect{name='nameIs2'}

获取连接MyConnect{name='nameIs2'}

释放连接:MyConnect{name='nameIs0'}

释放连接:MyConnect{name='nameIs2'}

释放连接:MyConnect{name='nameIs1'}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/223438.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE】多线程 (2) --线程安全

目录 1. 观察线程不安全 2. 线程安全的概念 3. 线程不安全的原因 4. 解决之前的线程不安全问题 5. synchronized 关键字 - 监视器锁 monitor lock 5.1 synchronized 的特性 5.2 synchronized 使⽤⽰例 1. 观察线程不安全 package thread; public class ThreadDemo19 {p…

Windows安装mysql8.0

官网地址&#xff1a;MySQL :: MySQL Community Downloads 选择相应版本信息下载 默认选择点击下一步 默认配置点击next 设置密码 默认配置

每天一道算法题:51. N 皇后

难度 困难 题目 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n_ _皇后问题 的…

关于水杯水

主要难点1.碰撞 &#xff08;水杯移动太快碰撞出问题 2.吃水 &#xff08;参数碰撞问题水随着时间变少 一.首先发射源&#xff1a;不易过小或者过大 过小>>>>水解算空间大水动态剧烈稳定慢 过大>>>>穿插漏水&#xff08;不用担心一般model环节会给&am…

Ubuntu安装Vmtools (最新安装教程)

Ubuntu安装Vmtools 1. 设置root用户密码2. 切换root用户3. 安装vmools 1. 设置root用户密码 出现认证失败&#xff08;Authentication failure&#xff09;的原因有两种&#xff0c;要么是密码输入错误&#xff0c;要么是新安装的系统还没有给root设置密码&#xff0c;&#x…

Python---可变和非可变数据类型

在Python中一共有7种数据类型&#xff1a; 数值&#xff08;int整型、float浮点类型&#xff09;、bool类型&#xff08;True和False&#xff09;、字符串类型&#xff08;str&#xff09;、元组&#xff08;tuple 1,2,3&#xff09;、列表&#xff08;list [1, 2, 3]&#xf…

i社为什么不出游戏了?

I社&#xff0c;即国际知名的游戏公司&#xff0c;近来为何鲜有新游问世&#xff1f;曾经风靡一时的游戏开发者&#xff0c;如今为何陷入了沉寂&#xff1f;这其中的种种原因&#xff0c;值得我们深入剖析。 首先&#xff0c;I社近期的沉寂可能与其内部管理层的调整和战略规划…

MATLAB中FFT频谱分析使用详解

文章目录 语法说明语法一&#xff1a;Y fft(X)fft(X)返回X长度的傅里叶变换 语法二&#xff1a;Y fft(X,N)如果 X的长度小于 N&#xff0c;则为 X补上尾零以达到长度 N(FFT插值)双边谱转换为单边谱 如果 X 的长度大于 N&#xff0c;则对 X 进行截断以达到长度 N。 语法三&…

CSS3制作3D爱心动画

1、什么是CSS css&#xff0c;即层叠样式表的简称&#xff0c;是一种标记语言&#xff0c;有浏览器解释执行用来使页面变得更美观。 2、选择器 css3中新增了一些选择器&#xff0c;如下&#xff1a; 3、新样式 边框 css3新增了三个边框属性&#xff0c;分别是&#xff1a; bo…

Flutter | TextField长按时选项菜单复制、粘贴显示为英文问题解决

Flutter | TextField长按时选项菜单复制、粘贴显示为英文问题解决 问题描述&#xff1a; 长按TextField后&#xff0c;显示剪切、复制等选项为英文&#xff0c;如下图所示&#xff0c;这是因为问未设置语言本地化&#xff0c;我们需要进行设置。 首先在pubspec.yaml加入以下依赖…

【力扣】907.子数组的最小值之和

【力扣】907.子数组的最小值之和 文章目录 【力扣】907.子数组的最小值之和1. 题目介绍2. 解法2.1 方法一&#xff1a;单调栈2.2 方法二&#xff1a;动态规划 3. Danger参考 1. 题目介绍 给定一个整数数组 arr&#xff0c;找到 min(b) 的总和&#xff0c;其中 b 的范围为 arr …

linux task_struct中进程调度相关的变量记录

参考文章&#xff1a; Linux进程调度分析记录&#xff0c;进程优先级&#xff0c;隔离处理器&#xff0c;isolcpus - 知乎