多线程编程-课堂笔记

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

你可能感兴趣的:(AQS,JAVA)