什么是AQS
aqs即AbstractQueuedSynchronizer(队列同步器)抽象类的简称,它是Java并发用来构建锁,和其他同步组件的基础框架,内部使用先进先出的同步队列实现,比如 ReentrantLock、CountDownLatch 和 Semaphore 等都是基于 AQS 实现的
AQS的核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态,如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
AQS的独占锁和共享式锁
独占锁模式下,每次只能有一个线程能持有锁,ReentrantLock就是以独占方式实现的互斥锁。共享锁,则允许多个线程同时获取锁,并发访问 共享资源,如:ReadWriteLock。AQS的内部类Node定义了两个常量SHARED和EXCLUSIVE,他们分别标识 AQS队列中等待线程的锁获取模式
AQS数据结构:
节点之间相互引用,头节点指向尾节点,每个节点存储内容还包括当前节点的状态
竞争失败的线程会打包成Node(源码里是aqs类的一个内部类)放到同步队列,
了解其中的方法
模板方法:&#