CountDownLatch 倒数计数器
public CountDownLatch(int count); //指定计数的次数,只能被设置1次
public void countDown(); //调用此方法则计数减1
public void await() throws InterruptedException //调用此方法会一直阻塞当前线程,直到计时器的值为0,除非线程被中断。
此类用来达到真正的并发执行。比如创建2000个线程去执行,在创建第1000个时候,前面的500个线程都有可能执行结束了,所以并不是真正的并发,通过countdownlatch来模拟真正的并发场景。
CyclicBarrier 线程栅栏
创建对象时,指定栅栏线程数量
await:等指定数量的线程都处于等待状态时,继续执行后续代码。
barrierAction: 线程数量到了指定量后,自动触发指定任务。
和CountDownLatch区别是可以多次触发执行
场景:
1.数据量比较大时,实现批量插入数据到数据库
2.数据统计,30个线程统计30天数据,全部统计完后执行汇总;
信号量semaphore
控制多个线程争抢许可
acquire:获取一个许可,如果没有就等待
release:释放一个许可
availablePermits:方法得到可用的许可数目
典型场景:代码并发处理限流。
AQS 抽象队列同步器
提供了对资源占用,释放,线程的等待,唤醒等等接口和具体的实现。
可以用在各种需要控制资源争用的场景中。
整体思路:park,unpark,cas,queue,手写lock,countdownlatch,cyclicbarrier,semaphore,然后抽取模板AQS
思考自己如何实现lock,countdownlatch,cyclicbarrier,semaphore