该系列博客主要分为上中下三篇分别介绍:AQS框架的原理、ReentrantLock上锁源码解析、ReentrantLock解锁源码解析
一、介绍
由于synchronize关键字在jdk1.6之前为重量级锁效率很低,每次对线程进行操作都需要涉及操作系统层面,于是并发大佬 Doug Lea 设计了JUC包,将线程同步操作提升到jdk级别,最差也是jvm级别。
队列同步器 AbstractQueuedSynchronizer,是用来构建锁或者其他同步器组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作,Doug Lea 期望他能够成为实现大部分同步需求的基础。
二、原理
AQS核心思想:
如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
CLH(Craig,Landin,and Hagersten)队列是一个虚拟的双向队列(虚拟的双向队列即不存在队列实例,仅存在结点之间的关联关系)。
AQS是将每条请求共享资源的线程封装成一个CLH锁队列的一个结点(Node)来实现锁的分配。
private transient volatile Node head; //队首
private transient volatile Node tail;