Java并发之同步二:Java并发工具类

一、CountDownLatch (1等多汇总、多等1 开关)

countdownlatch 底层原理,定义锁资源:0,当资源为0才叫拿到锁,所以countdownlatch也叫做倒数器,拿锁的时候判断是不是0,不是就park,然后countdown的时候,会- state的时,当state的值为1的时候,park的现场就会醒过来

在我的理解下,CountDownLatch可以理解为就是一个同步器,让谁先做,谁后做(或者说让哪些人先做,那些人后做)

两种情况:(谁等谁 await

  1. 子线程等主线程,那就是子线程await,主线程调用 countdown发号施令,主线程执行完,子线程执行(countDownLatch(1)作为开关

Java并发之同步二:Java并发工具类_第1张图片

  1. 主线程等子线程,那就是主线程await,自线程调用countdown完成任务,当所有子线程执行完,主线程执行(countDownLatch(10)作为完成信号

Java并发之同步二:Java并发工具类_第2张图片

二、CyclicBarrier(10) (满10个人开桌吃饭)

底层原理:多个线程来了之后,就会await,实际上也是调用lock.condition.await,同时-1 。当10减成0之后,开桌,本质上就是调用condition.signalAll。

cyclicBarrier与countdownlatch区别:countdownlatch一次性的,cyclicBarrier是可以重置的,countdownlatch是基于aqs共享模式的使用,cyclicBarrier时基于condition实现的

CyclicBarrier相当于上面的第2种情况,主线程等多个子线程完成之后,再干什么事

Java并发之同步二:Java并发工具类_第3张图片
创建5个子线程(运动员)准备,准备完成 await,等所有线程await数量达到栏栅要求的**指定线程数量,阑珊就会放开,相当于去掉了主线程还要打开开关的过程,只要所有线程await数量满足,自动放行。**当所有线程执行完之后,会执行CyclicBarrier第二个Runnable参数

三、Semaphore

这个类似于一个限流器,相当于高速公路上的闸口,当有很多车辆想要通过,但是闸口却只有那么多,那只能限流。

Java并发之同步二:Java并发工具类_第4张图片

四、Exchanger

留给你去看

你可能感兴趣的:(#,java并发,java,开发语言,Java并发,Java多线程)