简介
抽象队列同步器。多个线程出现抢占资源时,一旦有线程获取资源,其他线程放入队列,并阻塞(LockSuport.park() 该方法不会释放CPU资源)。当临界资源被释放,唤醒队列中的线程。
核心参数
- status 临界资源,判断是否获取到锁。通过cas进行修改。
- 阻塞队列 未获取到临界资源的线程,封装为node节点放入双向链表中。
- 条件队列 栅栏实现类,将线程放入条件队列,满足执行条件时转为同步队列,释放锁后释放所有线程
概念
- 独占锁 临界资源独占,只有一个线程可以访问
- 共享锁 多个线程可以同时执行
- 公平锁 队列有序执行,新来的线程需要直接放入队列
- 非公平锁 队列有序执行,但是新来的线程可以直接进行资源的争抢,抢不到放入队列
- 可重入 判断当前线程是不是自己 如果是将status+1
实现
- ReentrantLock 独占锁、可重入
- semaphore信号量 共享锁,可以执行同时执行的线程数
- cyclicBarrier 循环屏障(栅栏)凑够了指定数量才能执行
- countdownlatch 数量减到0 才会唤醒线程
实现流程
- ReentrantLock https://www.jianguoyun.com/p/Dd1NQHEQo4HTCBiP5K8D
- semaphore https://www.jianguoyun.com/p/DYxEthcQo4HTCBiR5K8D
- cyclicBarrier https://www.jianguoyun.com/p/DRV3Ld0Qo4HTCBiKl7wD
总结
aqs实现类为显示锁,开发者可以控制加锁解锁。底层主要使用cas对status进行操作,成功失败后作出相应处理。源码某些点设计较为巧妙,建议阅读源码。