首先我们通常说的并发包就是java.util.concurrent包及其子包。集中了Java并发的各种基础工具类。

一、这个并发包在哪

上面的包就是传说中的并发包。
为什么这个并发包就比较流弊呢?
原因主要有以下几点。

  1. 提供了几个比synchronized更加高级的各种同步结构。例如:CountDownLatch、CyclicBarrier、Semaphore等。可以实现更加丰富的多线程的操作。比如利用Semaphore作为资源控制器(其实可以简单理解为信号量),限制同时工作的线程的数量。

  2. 各种线程安全的容器。例如:无序的ConcurrentHashMap、有序的ConcurrentSkipListMap和线程安全的动态数组CopyOnWriteArrayList等。

  1. 各种并发队列的实现。比较典型的有ArrayBlockingQueue、SynchorousQueue或者优先级队列PriorityBlockingQueue等。

  2. 强大的Executor框架,可以创建各种不同类型的线程池,调度任务的运行,绝大部分情况下,用户不需要自己从头实现线程池和调度任务。

二、讲几个比较流弊用的较多的

万变不离其宗,抛砖引玉,如果这几个基础的你了解的比较好,以后再深入拓展就比较简单了。

空谈误国,实干兴邦,谢谢看嘛。

1、Semaphore

简单说,他就是一个计数器,其基本逻辑基于acquire/release申请或者获得资源。

  • Semaphore:Java版本的信号量的实现。用这个你就能实现对资源的管理。例如你一辆车做五个人,那么就赋值5。你只有一台打印机可以用,那就是1。

  • 1

package com.newframe.controllers.api;import lombok.Data;
import org.apache.commons.lang3.StringUtils;import java.util.concurrent.Semaphore;/*** 第一步* 创建一个实现了Runnable接口的信号量工作类* 并重写它的run方法,让他做我想要做的事情*/public class SemaphoreWorker implements Runnable{private String name;private Semaphore semaphore;public String getName() {return name;}public void setName(String name) {this.name = name;}//创建一个构造函数public SemaphoreWorker(Semaphore semaphore) {this.semaphore = semaphore;}@Overridepublic void run() {try {log("准备申请一个资源");semaphore.acquire();//申请资源log("申请到了资源");log("执行");} catch (InterruptedException e) {e.printStackTrace();}finally {//释放资源semaphore.release();log("释放资源成功");}}private void log(String msg){if (StringUtils.isEmpty(msg)){name = Thread.currentThread().getName();}System.out.println(name + " " + msg);}
}
  • 2
package com.newframe.controllers.api;import java.util.concurrent.Semaphore;/*** 第二步* 创建一个Semaphore的测试类*/
public class TestSemaphore {public static void main(String[] args) {System.out.println("我要开始执行了");//创建一个Semaphore对象,允许3个资源Semaphore semaphore = new Semaphore(3);for (int i = 0; i < 10; i++) {SemaphoreWorker worker = new SemaphoreWorker(semaphore);//给线程一个名字worker.setName("线程"+i);Thread thread = new Thread(worker);thread.start();}}
}

在上面可以很清晰的看到Semaphore对资源信号量的控制。
如我上面的信号量给的3,就是最多只能有3个线程能同时申请到资源。其余线程需要等待申请到的线程释放资源后才能获得资源。
看输出结果:

2、CountDownLatch和CyclicBarrier

他们的行为有一定的相似度。经常会用来要你理解他们有什么区别。

  • CountDownLatch 控制的这个数量是不可以重置的,两个线程不能够同时抢占CountDownLatch控制的资源数量。在前面的线程执行完后,后面的线程才可以执行。
  • CycliBarrier这个就很有意思了。这个比如说你有5个士力架,你上学,你吃完了,你一定要把5个都吃完,你立马可以获得新的5个士力架。你怕不怕。

3、CountDownLatch

下面我们来举个例子

  • 1
package com.newframe.controllers.api;import java.util.concurrent.CountDownLatch;/*** 创建第一个吃巧克力的家伙,叫他小明吧* 实现Runnable接口,并重写其方法*/
public class FirstBatchWorker implements Runnable{private CountDownLatch latch;public FirstBatchWorker(CountDownLatch latch) {this.latch = latch;}@Overridepublic void run() {//执行countDown()操作latch.countDown();System.out.println("小明吃了一块巧克力");}
}
  • 2
package com.newframe.controllers.api;import java.util.concurrent.CountDownLatch;/*** 创建第二个吃巧克力的家伙,叫他小李吧* 实现Runnable接口,并重写其方法*/
public class SecondBatchWorker implements Runnable{private CountDownLatch latch;public SecondBatchWorker(CountDownLatch latch) {this.latch = latch;}@Overridepublic void run() {try {latch.await();System.out.println("小李吃了一块巧克力");} catch (InterruptedException e) {e.printStackTrace();}}
}
  • 3
package com.newframe.controllers.api;import java.util.concurrent.CountDownLatch;/*** 来测试一下LatchSample*/
public class TestCountDownLatch {public static void main(String[] args) {//一共5个巧克力//同时有5个线程可以获取到资源CountDownLatch latch = new CountDownLatch(5);//下面的线程是按照顺序执行的。//五个小明线程for (int i = 0; i < 10; i++) {Thread thread = new Thread(new FirstBatchWorker(latch));thread.start();}//这个线程一定要等到上个线程全部执行完成了才可以执行for (int i = 0; i < 5; i++) {Thread thread = new Thread(new SecondBatchWorker(latch));thread.start();}}
}

执行结果

小明吃了一块巧克力
小明吃了一块巧克力
小明吃了一块巧克力
小明吃了一块巧克力
小明吃了一块巧克力
小明吃了一块巧克力
小明吃了一块巧克力
小明吃了一块巧克力
小明吃了一块巧克力
小明吃了一块巧克力
小李吃了一块巧克力
小李吃了一块巧克力
小李吃了一块巧克力
小李吃了一块巧克力
小李吃了一块巧克力

CountDownLatch用于线程间等待操作结束是非常普遍简单的用法。

4、CyclicBarrier

如果说CountDownLatch 是用于线程间等待操作结束的协调,那么CyclicBarrier其实反映的是线程间并行运行时的协调。
下面来看一个例子。

  • 1、
package com.newframe.controllers.api;import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;/*** 创建一个CyclicBarrier类,实现Runable接口*/
public class CyclicBarrierWorker implements Runnable{private CyclicBarrier cyclicBarrier;public CyclicBarrierWorker(CyclicBarrier cyclicBarrier) {this.cyclicBarrier = cyclicBarrier;}@Overridepublic void run() {try {for (int i = 0; i < 3; i++) {System.out.println("执行");cyclicBarrier.await();}} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}}
}
  • 2、
package com.newframe.controllers.api;import java.util.concurrent.CyclicBarrier;/*** 测试一下CyclicBarrier*/
public class TestCyclicBarrier {public static void main(String[] args) {CyclicBarrier barrier = new CyclicBarrier(5, new Runnable() {@Overridepublic void run() {System.out.println("操作再次......执行");}});for (int i = 0; i < 5; i++) {Thread thread = new Thread(new CyclicBarrierWorker(barrier));thread.start();}}
}
  • 执行结果
执行
执行
执行
执行
执行
操作再次......执行
执行
执行
执行
执行
执行
操作再次......执行
执行
执行
执行
执行
执行
操作再次......执行

三、Java并发库的小知识

Java并发库还提供了Phaser,功能与CountDownLatch很接近。
Java并发库还提供了线程安全的Map、List和Set等容器。

ConcurrentHashMap:侧重通过键值对,放入或者获取的速度,对顺序无所谓。
ConcurrentSkipListMap:通过键值对操作数据,侧重数据的顺序操作。如果对大量数据进行频繁的修改,ConcurrentSkipListMap也是有优势的。

好啦,今天就到这里啦。好记性比不上烂笔头,还是的亲自实践一下的。

Java并发包中那些值得学习的并发工具类(空谈误国,实干兴邦,代码示范,抛砖引玉)相关推荐

  1. 第 5-6 课:Java 并发包中的高级同步工具 + 面试题

    Java 中的并发包指的是 java.util.concurrent(简称 JUC)包和其子包下的类和接口,它为 Java 的并发提供了各种功能支持,比如: 提供了线程池的创建类 ThreadPool ...

  2. Java并发包中常用类

    Java并发包中常用类小结(一) 从JDK1.5以后,Java为我们引入了一个并发包,用于解决实际开发中经常用到的并发问题,那我们今天就来简单看一下相关的一些常见类的使用情况. 1.Concurren ...

  3. Java并发包中常用类小结(一)

                                   Java并发包中常用类小结(一) 从JDK1.5以后,Java为我们引入了一个并发包,用于解决实际开发中经常用到的并发问题,那我们今天就来 ...

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

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

  5. Java 中的并发工具类

    From: https://blog.wuwii.com/juc-utils.html java.util.concurrent 下提供了一些辅助类来帮助我们在并发编程的设计. 学习了 AQS 后再了 ...

  6. java工具类应该抛异常吗,java学习阶段一 工具类(异常)

    java学习阶段一 工具类(异常) 介绍 异常:运行期间出现的错误 背离程序本身意图的表现 基本知识 异常的分类 根类 Throwable Error 程序无法处理的错误 表示运行应用程序中教严重的问 ...

  7. 《Java并发编程的艺术》读后笔记-Java中的并发工具类(第八章)

    文章目录 <Java并发编程的艺术>读后笔记-Java中的并发工具类(第八章) 1.等待多线程完成的CountDownLatch 2.同步屏障CyclicBarrier 2.1 Cycli ...

  8. 【搞定Java并发编程】第24篇:Java中的并发工具类之CountDownLatch

    上一篇:Java中的阻塞队列 BlockingQueue 详解 本文目录: 1.CountDownLatch的基本概述 2.CountDownLatch的使用案例 3.CountDownLatch的源 ...

  9. 《Java并发编程的艺术》读书笔记 - 第八章 - Java中的并发工具类

    目录 前言 等待多线程完成的 CountDownLatch 示例 同步屏障 CyclicBarrier 示例 CyclicBarrier 和 CountDownLatch 的区别 控制并发线程数量的 ...

最新文章

  1. nanopore测序技术专题(六):测序错误率太高无法使用?
  2. 将服务器置于最终用户附近可解决性能问题?—Vecloud微云
  3. Octave相关学习资源整理出
  4. Docker Compose部署GitLab服务,搭建自己的代码托管平台(图文教程)
  5. apache的斜杠问题
  6. apache.camel_Apache Camel 2.9发布–十大变化
  7. 反编译工具Reflector 4.2 汉化版
  8. MATLAB 基础知识学习
  9. 要么放权,要么输得起 | 卫哲谈战略
  10. markdown2 awesomium 无法预览
  11. Tarjan算法详细讲解
  12. nlp情感分析经典书籍推荐_通过监督学习对书籍进行情感分析
  13. 数据结构与算法基本概念
  14. Linux-Kali——安装软件_添加桌面快捷方式启动器_添加到应用程序菜单_Kali安装Typora
  15. Android动画了解—转场/过渡(Transition) 动画
  16. 热门解读:社交裂变的拉新效果评估及优化
  17. 立志高远;毕业后计划
  18. AI芯片:寒武纪Cambricon-X结构分析
  19. 5G来了,室内该如何覆盖?
  20. Java 20 超神版正式发布,展示了 Java 技术的最新进展

热门文章

  1. 网络安全学习(千锋网络安全笔记)2--IP与基本DOS命令
  2. 我们把AR产业链大卸128块,然后发现消费级AR还很远
  3. Matlab 斜率和曲率,曲率_与闪电共舞_新浪博客
  4. 基于matlab tcr fc 无功补偿,基于MATLAB的静止无功补偿器的仿真研究
  5. 【Unity】U3D TD游戏制作实例(三)相机管理器、生成敌人优化、敌人血槽小组件
  6. 为什么《大长今》是湖南卫视引入的?
  7. 机器学习 --- 4. 大内密探HMM(隐马尔可夫)围捕赌场老千
  8. 超简单的HTML5圣诞树代码哦
  9. Spring事务和MySQL事务详解面试
  10. FFmpeg+SDL视频播放器