一、CountDownLatch (1等多汇总、多等1 开关)
countdownlatch 底层原理,定义锁资源:0,当资源为0才叫拿到锁,所以countdownlatch也叫做倒数器,拿锁的时候判断是不是0,不是就park,然后countdown的时候,会- state的时,当state的值为1的时候,park的现场就会醒过来
在我的理解下,CountDownLatch可以理解为就是一个同步器,让谁先做,谁后做(或者说让哪些人先做,那些人后做)
两种情况:(谁等谁 await)
- 子线程等主线程,那就是子线程await,主线程调用 countdown发号施令,主线程执行完,子线程执行(countDownLatch(1)作为开关)
- 主线程等子线程,那就是主线程await,自线程调用countdown完成任务,当所有子线程执行完,主线程执行(countDownLatch(10)作为完成信号)
二、CyclicBarrier(10) (满10个人开桌吃饭)
底层原理:多个线程来了之后,就会await,实际上也是调用lock.condition.await,同时-1 。当10减成0之后,开桌,本质上就是调用condition.signalAll。
cyclicBarrier与countdownlatch区别:countdownlatch一次性的,cyclicBarrier是可以重置的,countdownlatch是基于aqs共享模式的使用,cyclicBarrier时基于condition实现的
CyclicBarrier相当于上面的第2种情况,主线程等多个子线程完成之后,再干什么事
创建5个子线程(运动员)准备,准备完成 await,等所有线程await数量达到栏栅要求的**指定线程数量,阑珊就会放开,相当于去掉了主线程还要打开开关的过程,只要所有线程await数量满足,自动放行。**当所有线程执行完之后,会执行CyclicBarrier第二个Runnable参数
三、Semaphore
这个类似于一个限流器,相当于高速公路上的闸口,当有很多车辆想要通过,但是闸口却只有那么多,那只能限流。
四、Exchanger
留给你去看😄