并发工具类【线程安全相关的类】
1.Hashtable和ConcurrentHashMap
Hashtable:哈希表结构(数组+链表),线程安全的(同步代码块,效率低)
ConcurrentHashMap:
jdk7:采用Segment数组[不会扩容] + HashEntry[二次哈希计算存入的位置,可扩容],线程安全(synchronized)
jdk8:哈希表结构(数组+链表+红黑树),线程安全的(synchronized+CAS算法,效率高)
【注:使用线程不安全的类可能会出现赋值为null的情况】
public class Demo3 {public static void main(String[] args) throws InterruptedException {//Hashtable<String, String> hsTable = new Hashtable<>();ConcurrentHashMap<String, String> concurrentHashMap = new ConcurrentHashMap<>();Thread thread1 = new Thread(() -> {for (int i = 0; i < 25; i++) {concurrentHashMap.put(i + "", i + "");}});Thread thread2 = new Thread(() -> {for (int i = 25; i < 51; i++) {concurrentHashMap.put(i + "", i + "");}});thread1.start();thread2.start();System.out.println("--------------------");//为了两条线程的数据都添加完毕Thread.sleep(1000);//打印集合的所有值for (int i = 0; i < 51; i++) {System.out.println(concurrentHashMap.get(i + ""));}}
}打印结果:
--------------------------------------------------------------------------------------
0
......
49
50
2.CountDownLatch
孩子吃完饺子,妈妈收拾碗筷【使用场景:当需要某一个线程在其他线程执行完毕之后才执行】
原理:创建CountDownLatch的对象,参数为等待线程的数量, 并定义了一个计数器,初始值为参数的值
//CountDownLatch 并发工具类
public class Demo {public static void main(String[] args) {//创建CountDownLatch的对象,参数为等待线程的数量//并定义了一个计数器,初始值为参数的值【参数为多少则几条线程结束后才执行】CountDownLatch countDownLatch = new CountDownLatch(1);//countDownLatch传递到4个线程时,它们则共用一个计数器MotherThread motherThread = new MotherThread(countDownLatch,"妈妈---");ChildThread1 childThread1 = new ChildThread1(countDownLatch,"小刚---");//ChildThread2 childThread2 = new ChildThread2(countDownLatch,"小明---");//ChildThread3 childThread3 = new ChildThread3(countDownLatch,"小红---");motherThread.start();childThread1.start();//childThread2.start();//childThread3.start();}
}//ChildThread1 孩子1线程,同理其他孩子线程与之一致,可复制添加
public class ChildThread1 extends Thread {private CountDownLatch countDownLatch;public ChildThread1(CountDownLatch countDownLatch, String s) {this.countDownLatch = countDownLatch;this.setName(s);}@Overridepublic void run() {//1.吃饺子for (int i = 1; i <= 3; i++) {System.out.println(Thread.currentThread().getName() + "在吃" + i + "个饺子");}//2.吃完说一声//每一次countDown方法后,count--;countDownLatch.countDown();}
}//妈妈线程
public class MotherThread extends Thread{private CountDownLatch countDownLatch;public MotherThread(CountDownLatch countDownLatch, String s) {this.countDownLatch=countDownLatch;}@Overridepublic void run() {try {//1.等待//当计数器变为0时,会自动唤醒等待的线程countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}//2.收拾碗筷System.out.println("妈妈正在收拾碗筷");}
}打印结果:
--------------------------------------------------------------------------------------
小刚---在吃1个饺子
小刚---在吃2个饺子
小刚---在吃3个饺子
妈妈正在收拾碗筷
3.Semaphore管理员对象
用来控制正在执行的线程数量
//Semaphore管理员对象【用来控制正在执行的线程数量】
public class Demo1 {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();//开启100条线程for (int i = 0; i < 4; i++) {new Thread(myRunnable).start();}}
}//具体实现类
public class MyRunnable implements Runnable {//1.创建Semaphore对象,参数为通行证数量Semaphore semaphore =new Semaphore(2);@Overridepublic void run() {try {//2.获得通行证semaphore.acquire();//3.开始行驶System.out.println("获得了通行证开始通行");//4.归还通行证System.out.println("归还通信证");semaphore.release();} catch (InterruptedException e) {e.printStackTrace();}}
}打印结果:
--------------------------------------------------------------------------------------
获得了通行证开始通行
归还通信证
获得了通行证开始通行
归还通信证
获得了通行证开始通行
归还通信证
获得了通行证开始通行
归还通信证
4.其他线程安全类
StringBuilder和StringBuffer
StringBuilder: 线程不安全的(效率高)
StringBuffer: 线程安全的(效率低)
安全的原因是因为其内部方法都有锁
ArrayList和Vector
ArrayList: 数组结构,线程不安全(效率高)
Vector: 数组结构,线程安全的(效率低)
并发工具类【线程安全相关的类】相关推荐
- Java并发工具Exchanger线程间交换数据
本文目录 Exchanger简介 Exchanger使用介绍 Exchanger简介 Exchanger是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交 换.它提供一个同步点,在 ...
- 学习笔记:Java 并发编程⑥_并发工具_JUC
若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...
- java多线程工具类_Java多线程系列之:线程的并发工具类
一,Fork-Join 1,定义: Fork-Join框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不能再拆时),再将一个个的小任务运算的结果进行join汇总. 2, ...
- 并发工具类(四)两个线程进行数据交换的Exchanger
简介 Exchanger(交换者)是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交换.它提供一个同步点,在这个同步点两个线程可以交换彼此的数据.这两个线程通过exchange方法 ...
- 并发工具类(四)线程间的交换数据 Exchanger
前言 JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ...
- 常用并发工具类(锁和线程间通信工具类)
常用并发工具类总结 JUC 下的常用并发工具类(锁和线程间通信工具类),主要包括 ReentrantLock.ReentrantReadWriteLock.CountDownLatch.CyclicB ...
- 线程池、volatile、原子性、并发工具类
目录 线程状态 线程池-基本原理 线程池 - Executors默认线程池 线程池 - ThreadPoolExecutor 线程池参数-拒绝策略 volatile 原子性 原子性 - AtomicI ...
- 《Java并发编程的艺术》——Java中的并发工具类、线程池、Execute框架(笔记)
文章目录 八.Java中的并发工具类 8.1 等待多线程完成的CountDownLatch 8.2 同步屏障CyclicBarrier 8.2.1 CyclicBarrier简介 8.2.2 Cycl ...
- day14 线程池、原子性、并发工具类
目录 一.线程池 1.1 线程状态 1.2 线程池的基本原理 1.3 Executors默认线程池 1.4 创建指定上限的线程池 1.5 ThreadPoolExecutor(线程池执行器) 1.5. ...
最新文章
- Divide it!
- 在windows xp下编译出ffmpeg.exe
- 浅谈开发中的MVVM模式及与MVP和MVC的区别
- 将文件内含有的特殊字符还原
- 软件开发工程师应该具备哪些证书_智能展厅设计应该具备哪些特点?
- 编译原理文法等价变换
- fisco bcos console控制台 调用合约报错 does not exist
- 357.计算各个位数不同的数字个数
- windows做软件界面
- K8S你知道,K9S你可能也知道,那Lens呢?
- 计算机管理照相机感叹号,电脑设备管理器摄像头驱动出现黄色感叹号是怎么回事儿 - 驱动管家...
- ----uni-app之APP关联小程序实现扫描APP二维码跳转关联小程序----
- 简述数据可视化制作流程
- 飞秋在同一局域网内刷新不到好友
- Englis - 英文字母和音标
- C++字符串操作函数strstr,strcmp,strlen,strcpy,strcat,strok
- 测试参持之以恒兵勋章活动
- 2022年济南12行政区高新技术企业补贴政策及认定条件汇总
- 挂耳式运动耳机哪个品牌好?挂耳式骨传导运动耳机推荐
- 树莓派python驱动PCA9685
热门文章
- 线性代数四之动态DP(广义矩阵加速)——Can you answer these queries III,保卫王国
- 【正睿2021寒假省选第二轮集训 day 1】令牌生成 (组合数+二分)
- 51nod1836-战忽局的手段【期望dp,矩阵乘法】
- 学习手记(2018.11.30~2019.6.6)——养老时间
- POJ2018-Best Cow Fences【实数二分答案】
- jzoj1267-路障【最短路,SPFA】
- AtCoder Beginner Contest 211 E - Red Polyomino(暴力+状态记录)
- 【KMP】重复子串(ybtoj KMP-2)
- 【最短路】【SPFA】电车 (luogu 1346)
- 2017西安交大ACM小学期数论 [完全平方数]