文章目录
- 一、前置知识
- 二、什么是AQS
- 三、使用AQS框架的锁和同步器
- 1、ReentrantLock
- 2、ReentrantReadWriteLock
- 3、CountDownLatch
- 4、CyclicBarrier
- 5、Semaphore:信号量
- 四、锁和同步器的关系
- 1、锁:面向锁的使用者
- 2、同步器:面向锁的实现者
- 五、AQS能做什么
一、前置知识
(1)可重入锁
(2)自旋思想
(3)LockSupport
(4)数据结构之双向链表
(5)设计模式之模板方法设计模式:设计模式: 模板方法模式
二、什么是AQS
AQS全称是AbstractQueuedSynchronizer: 抽象队列同步器,是阻塞锁和相关同步器工具的框架是整个JUC体系的基石,通过内置的FIFO队列来完成资源获取线程的队列工作,并通过一个int类型变量标识持有锁的状态
- 资源(state)
- CLH队列:双向队列
三、使用AQS框架的锁和同步器
1、ReentrantLock
(1)锁实现
- 公平锁FairSync
- 非公平锁NonFairSync
(2)Condition - 多线程协调通讯类
- Condition维护了一个线程等待队列,也是多线程间协调通信的工具,是的某个线程一起等待某个条件,满足条件才能唤醒,唤醒后,还需要重新竞争锁。
2、ReentrantReadWriteLock
3、CountDownLatch
(1)通过一个计数器来实现,每当一个线程执行完成后,计数器的值就减1,当计数器的值为0时,则表示所有的线程都执行完毕。
(2)await():调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行。
(3)await(long timeout, TimeUnit unit):等待一定的时间后count值还没有变为0的话就会继续执行。
(4)countDown():将count值减1
4、CyclicBarrier
5、Semaphore:信号量
四、锁和同步器的关系
1、锁:面向锁的使用者
定义了程序员和锁交互的使用层API,隐藏了实现细节,调用API即可。
2、同步器:面向锁的实现者
统一规范并简化了锁的实现,屏蔽了同步状态管理、阻塞线程队列和通知、唤醒机制等,是一切锁和同步组件实现的公共基础部分。