一、CountDownLatch(计数器)

  • 原理:
    CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞。其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),当计数器的值变为0时,await方法阻塞的线程会被唤醒,继续执行。
  • 代码:
/*** @Description:*  让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒。* CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞。* 其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),* 当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。* 解释:6个同学陆续离开教室后值班同学才可以关门。* main主线程必须要等前面6个线程完成全部工作后,自己才能开干 */
public class CountDownLatchDemo
{public static void main(String[] args) throws InterruptedException{CountDownLatch countDownLatch = new CountDownLatch(6);for (int i = 1; i <=6; i++) //6个上自习的同学,各自离开教室的时间不一致{new Thread(() -> {System.out.println(Thread.currentThread().getName()+"\t 号同学离开教室");countDownLatch.countDown();}, String.valueOf(i)).start();}//计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。countDownLatch.await();System.out.println(Thread.currentThread().getName()+"\t****** 班长关门走人,main线程是班长");    }
}
  • CountDownLatch简单的说就是一个线程等待,直到他所等待的其他线程都执行完成并且调用countDown()方法发出通知后,当前线程才可以继续执行。

二、CyclicBarrier(循环栅栏)

  • 原理:
    CyclicBarrier 的字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。 线程进入屏障通过CyclicBarrier的await()方法。
  • 代码:
/*** 粗俗理解:集齐7颗龙珠就可以召唤神龙*/
public class CyclicBarrierDemo
{private static final int NUMBER = 7;public static void main(String[] args){//CyclicBarrier(int parties, Runnable barrierAction) CyclicBarrier cyclicBarrier = new CyclicBarrier(NUMBER, ()->{System.out.println("*****集齐7颗龙珠就可以召唤神龙");}) ;for (int i = 1; i <= 7; i++) {new Thread(() -> {try {System.out.println(Thread.currentThread().getName()+"\t 星龙珠被收集 ");cyclicBarrier.await();} catch (InterruptedException | BrokenBarrierException e) {// TODO Auto-generated catch blocke.printStackTrace();}}, String.valueOf(i)).start();}}
}
  • cyclicBarrier是所有线程都进行等待,直到所有线程都准备好进入await()方法之后,所有线程同时开始执行!

三、Semaphore(信号灯)

  • 原理:
    在信号量上我们定义两种操作:acquire(获取) 当一个线程调用acquire操作时,它要么通过成功获取信号量(信号量减1), 要么一直等下去,直到有线程释放信号量,或超时。 release(释放)实际上会将信号量的值加1,然后唤醒等待的线程。 信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。例如停车场,有位就进去,进去后一定时间就出来给其他车。
    信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。
public class SemaphoreDemo {public static void main(String[] args) {//三个停车位Semaphore sp = new Semaphore(3);//停六个汽车for (int i = 1; i <=6 ; i++) {new Thread(()->{try {sp.acquire();System.out.println(Thread.currentThread().getName()+"\t号车驶入停车位");TimeUnit.SECONDS.sleep(3);System.out.println(Thread.currentThread().getName()+"\t号车驶出停车位");} catch (InterruptedException e) {e.printStackTrace();} finally {sp.release();}},String.valueOf(i)).start();}}
}

四、FutureTask(未来任务)

在FutureTask中,AQS同步状态被用来保存人任务的状态,例如:正在运行、已完成或已取消。FutureTask还维护一些额外的状态变量,用来保存计算结果或者抛出的异常。此外,他还维护一个引用,指向正在执行计算任务的线程(如果它当前处于运行状态),因而如果任务取消,该线程就会中断。

五、ReentrantLock(可重入锁)

ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性(关于synchronized可以看这篇文章),synchronized通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持公平锁和非公平锁两种方式。那么,要想完完全全的弄懂ReentrantLock的话,主要也就是ReentrantLock同步语义的学习:

  1. 重入性的实现原理;
  2. 公平锁和非公平锁。

六、ReentrantReadWriteLock(可重入读写锁)

ReadWriteLock接口表示存在两个锁:一个读锁和一个写锁,但在基于AQS实现的ReentrantReadWriteLock中,单个AQS子类将同时管理读取加锁和写入加锁。ReentrantReadWriteLock使用了一个16位的状态来表示写入锁的计数,并且使用了另一个16位的状态来表示读取锁的计数。在读取锁上的操作将使用共享的获取方法与释放方法,在写入锁的操作将使用独占的获取方法是释放方法。
AQS在内部维护了一个等待线程队列,其中记录了某个线程请求的是独占访问还是共享访问。在ReentrantReadWriteLock中,当锁可用时,如果位于队列头部的线程执行写入操作,那么线程会得到这个锁,如果位于队列头部的线程执行读取访问,那么队列中在第一个写入线程的所有线程 之前的所有线程都将得到这个锁。

七、运动会例子

举一个例子,开运动会,参赛名单打印出来公示,如果有修改,不可能在告示单上增加或者删除,就是直接重出一份告示(CopyOnWriteArrayList)。开赛前准备阶段,运动员要就行检查,贴号码牌,不可能几个工作人员同时对一个运动员进行修改(concurrentHashmap)。运动员上跑道,5人一组,剩下的下一组,这里体现的就是(seamphore的作用,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制),然后发令员看到5个参数选手都准备好后,便发令比赛开始,这里体现的就是(cyclicBarrier的作用:所有线程都进行等待,直到所有线程都准备好进入await()方法之后,所有线程同时开始执行!)。冲线的时候,就体现了Aotumic类的作用,反正高并发不能准确修改信息。最后领奖的时候,就是体现(CountDownLatch的作用:简单的说就是一个线程(颁奖这个线程)等待,直到他所等待的其他线程都执行完成(所有参赛选手都完成比赛),再调用countDown()方法发出通知后,当前线程(颁奖线程)才可以继续执行。

JUC重要辅助类(同步组件及锁)相关推荐

  1. JUC的那些同步锁们

    JUC的那些同步锁们 Reentranlock ReadWriteLock CountDownLatch CyclicBarrier Semaphore Exchanger LockSupport R ...

  2. cas客户端登陆状态不同步_Java并发——同步组件

    特指Java.util.concurrent(JUC)包下的同步组件,包括AbstractQuenedSynchronizer(AQS).ReentrantLock.CyclicBarrier等. 关 ...

  3. Java同步组件之CyclicBarrier,ReentrantLock

    文章目录 Java同步组件概况 `CyclicBarrier`介绍 与`CountDownLatch`比较 相同点 不同点 `CountDownLatch`和`CyclicBarrier`的场景比较 ...

  4. Java同步组件之CountDownLatch,Semaphore

    Java同步组件概况 CountDownLatch : 是闭锁,通过一个计数来保证线程是否一直阻塞 Semaphore: 控制同一时间,并发线程数量 CyclicBarrier:字面意思是回环栅栏,通 ...

  5. JUC并发编程之Callable接口、JUC三大辅助类

    目录 8. Callable接口 8.1 创建线程的多种方式 8.2 概述 8.3 用Callable接口创建Thred线程 8.4 小结(重点) 9. JUC 三大辅助类 9.1 概述 9.2 减少 ...

  6. Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析

    1.简介 在分析完AbstractQueuedSynchronizer(以下简称 AQS)和ReentrantLock的原理后,本文将分析 java.util.concurrent 包下的两个线程同步 ...

  7. Java同步组件之Condition,FutureTask

    Java同步组件概况 CountDownLatch : 是闭锁,通过一个计数来保证线程是否一直阻塞 Semaphore: 控制同一时间,并发线程数量 CyclicBarrier:字面意思是回环栅栏,通 ...

  8. AQS原理及AQS同步组件总结

    前言 常见问题:AQS 原理?;CountDownLatch和CyclicBarrier了解吗,两者的区别是什么?用过Semaphore吗? 本节思维导图: 1 AQS 简单介绍 AQS的全称为(Ab ...

  9. Java多线程之线程同步机制(锁,线程池等等)

    Java多线程之线程同步机制 一.概念 1.并发 2.起因 3.缺点 二.三大不安全案例 1.样例一(模拟买票场景) 2.样例二(模拟取钱场景) 3.样例三(模拟集合) 三.同步方法及同步块 1.同步 ...

最新文章

  1. CADisplayLink 及定时器的使用
  2. 成功解决The scripts freeze_graph.exe, saved_model_cli.exe, tensorboard.exe, tflite_convert.exe, toco.exe
  3. android fragment contextmenu,在 fragment 中,无法为listView项创建 contextMenu_android_开发99编程知识库...
  4. ajax nginx 转发 sessionid_Nginx+Apache实现动静分离 - 孙天飞
  5. centos7 yum 安装lnmp
  6. 无监督学习 k-means_监督学习-它意味着什么?
  7. ASP.NET Core文件上传IFormFile于Request.Body的羁绊
  8. Linux常用指令2
  9. C#线程锁使用全功略
  10. python批量查看邮件_python win32com批量阅读outlook电子邮件打开的项目太多
  11. Linux现在已主导Azure
  12. python播放音频文件
  13. 被忽视的大型互联网企业安全隐患:第三方开源WiKi程序
  14. 哈佛大学幸福课笔记二
  15. 小猿日记 - 程序猿的日常日记(3)
  16. mysql建立序列相关操作 sequence
  17. 英文投稿过程中的十种状态
  18. 使用WLW 写博客的测试
  19. 669-Server端如何感知客户端的状态
  20. JVM调优专题-JVM调优参数

热门文章

  1. Silverlight控件-Slider
  2. PHP Parse error: parse error, unexpected T_OBJECT_OPERATOR
  3. 2010考研全程学习规划简案【推荐】
  4. Ubuntu下搭建MPI并行计算环境
  5. 【笔记】基于边缘检测和BP神经网络的大豆杂草识别研究
  6. 【Matlab】函数输入个数不定怎么办?
  7. [云炬ThinkPython阅读笔记]3.4 增加新函数
  8. [云炬python3玩转机器学习]6-3线性回归中的梯度下降法
  9. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170326
  10. [C++调试笔记]执行声明的读写文件操作