深入理解AQS
2023-07-03 11:59:44 5 举报
AQS的原理解析
作者其他创作
大纲/内容
<b>AQS:是一个用来实现依赖状态的同步器</b>
reentrantLock,countDownLatch等都是通过一个内部类<b>Sync</b>集成AQS,将同步器所有调用都映射到Sync对应的方法
<b>AQS特性:</b>
阻塞等待队列
<b><font color="#b71c1c">同步等待队列</font>:存放获取锁失败时入队的线程</b>
CLH队列:是一个基于<b>双向链表</b>数据结构的队列,是<b>FIFO先进先出线程</b>等待队列
<b><font color="#b71c1c">条件等待队列</font>:调用await()的时候会释放锁,线程进入条件队列,调用signal()唤醒线程时会把条件队列的线程放到<font color="#b71c1c">同步等待队列</font>中,等待再次获取锁</b>
使用单向列表保存,用nextWaiter来连接:
调用await方法阻塞线程
当前线程存在同步队列的头节点,调用await方法进行阻塞(从同步队列转为条件队列)
共享/独占<b><font color="#212121">:</font><font color="#b71c1c">tryAcquire()</font></b>实现<font color="#b71c1c">独占</font>方式,成功获取锁返回true,失败返回false,<b><font color="#b71c1c">tryAcquireShared()</font></b>实现共享方式,返回<b>负数表示获取锁失败,<font color="#b71c1c">0</font>表示成功,但是没有剩余资源,<font color="#b71c1c">正数</font>表示成功,且有剩余资源</b>
公平/非公平:默认非公平,可以在构造方法中传true,创建公平锁
公平:加锁时直接进入队列
非公平:先去cas尝试获取锁,有一定的几率插入成功
可重复:获取锁时会绑定当前线程,重入锁时判断线程是否相等,相等则维护state的值,可以通过state的值判断锁重入的次数
允许中断:
0 条评论
下一页