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: 数组结构,线程安全的(效率低)

并发工具类【线程安全相关的类】相关推荐

  1. Java并发工具Exchanger线程间交换数据

    本文目录 Exchanger简介 Exchanger使用介绍 Exchanger简介 Exchanger是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交 换.它提供一个同步点,在 ...

  2. 学习笔记:Java 并发编程⑥_并发工具_JUC

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...

  3. java多线程工具类_Java多线程系列之:线程的并发工具类

    一,Fork-Join 1,定义: Fork-Join框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不能再拆时),再将一个个的小任务运算的结果进行join汇总. 2, ...

  4. 并发工具类(四)两个线程进行数据交换的Exchanger

    简介 Exchanger(交换者)是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交换.它提供一个同步点,在这个同步点两个线程可以交换彼此的数据.这两个线程通过exchange方法 ...

  5. 并发工具类(四)线程间的交换数据 Exchanger

    前言   JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ...

  6. 常用并发工具类(锁和线程间通信工具类)

    常用并发工具类总结 JUC 下的常用并发工具类(锁和线程间通信工具类),主要包括 ReentrantLock.ReentrantReadWriteLock.CountDownLatch.CyclicB ...

  7. 线程池、volatile、原子性、并发工具类

    目录 线程状态 线程池-基本原理 线程池 - Executors默认线程池 线程池 - ThreadPoolExecutor 线程池参数-拒绝策略 volatile 原子性 原子性 - AtomicI ...

  8. 《Java并发编程的艺术》——Java中的并发工具类、线程池、Execute框架(笔记)

    文章目录 八.Java中的并发工具类 8.1 等待多线程完成的CountDownLatch 8.2 同步屏障CyclicBarrier 8.2.1 CyclicBarrier简介 8.2.2 Cycl ...

  9. day14 线程池、原子性、并发工具类

    目录 一.线程池 1.1 线程状态 1.2 线程池的基本原理 1.3 Executors默认线程池 1.4 创建指定上限的线程池 1.5 ThreadPoolExecutor(线程池执行器) 1.5. ...

最新文章

  1. Divide it!
  2. 在windows xp下编译出ffmpeg.exe
  3. 浅谈开发中的MVVM模式及与MVP和MVC的区别
  4. 将文件内含有的特殊字符还原
  5. 软件开发工程师应该具备哪些证书_智能展厅设计应该具备哪些特点?
  6. 编译原理文法等价变换
  7. fisco bcos console控制台 调用合约报错 does not exist
  8. 357.计算各个位数不同的数字个数
  9. windows做软件界面
  10. K8S你知道,K9S你可能也知道,那Lens呢?
  11. 计算机管理照相机感叹号,电脑设备管理器摄像头驱动出现黄色感叹号是怎么回事儿 - 驱动管家...
  12. ----uni-app之APP关联小程序实现扫描APP二维码跳转关联小程序----
  13. 简述数据可视化制作流程
  14. 飞秋在同一局域网内刷新不到好友
  15. Englis - 英文字母和音标
  16. C++字符串操作函数strstr,strcmp,strlen,strcpy,strcat,strok
  17. 测试参持之以恒兵勋章活动
  18. 2022年济南12行政区高新技术企业补贴政策及认定条件汇总
  19. 挂耳式运动耳机哪个品牌好?挂耳式骨传导运动耳机推荐
  20. 树莓派python驱动PCA9685

热门文章

  1. 线性代数四之动态DP(广义矩阵加速)——Can you answer these queries III,保卫王国
  2. 【正睿2021寒假省选第二轮集训 day 1】令牌生成 (组合数+二分)
  3. 51nod1836-战忽局的手段【期望dp,矩阵乘法】
  4. 学习手记(2018.11.30~2019.6.6)——养老时间
  5. POJ2018-Best Cow Fences【实数二分答案】
  6. jzoj1267-路障【最短路,SPFA】
  7. AtCoder Beginner Contest 211 E - Red Polyomino(暴力+状态记录)
  8. 【KMP】重复子串(ybtoj KMP-2)
  9. 【最短路】【SPFA】电车 (luogu 1346)
  10. 2017西安交大ACM小学期数论 [完全平方数]