AbstractQueuedSynchronizer,提供FIFO队列,构建锁或者其他同步组件(信号量、事件等、ReentrantLock、CountDownLatch)的基础框架类。
抽象类继承方式使用,没实现任何同步接口,仅定义同步状态的获取及释放方法提供自定义同步组件。
概要:aqs两种功能、内部实现、添加/del节点
一、AQS的两种功能
独占锁:每次只能一个线程持有锁,ReentrantLock独占方式实现互斥锁
共享锁:允许多个线程同时获取锁,并发访问共享资源,如ReentrantReadWriteLock
二、AQS内部实现
FIFO双向队列,双向链表两个指针,指向后继和前驱节点。如当前线程竞争锁失败,AQS把当前线程以及等待状态信息构造成一个Node加到同步队列(由线程封装),同时再阻塞该线程。获取锁线程释放锁后,会从队列中唤醒一个阻塞的节点(线程)。
三、释放锁 及 添加线程 对于队列变化
1、添加节点两个变化
1)新线程封装成Node节点追加到同步队列中,设置prev节点以及修改当前节点的前置节点的next节点指向自己
2)通过CAS将tail重新指向新的尾部节点
2、释放锁移除节点
head节点表示获锁成功节点,头结点释放同步状态时,唤醒后继节点,获锁成功把自己设置为头结点。两个变化
1)修改head节点指向下一个获得锁的节点
2)新获得锁节点,将prev的指针指向null
小变化:设置head节点不需用CAS,原因是设置head节点是由获得锁线程来完成,同步锁只能由一个线程获得,不需要CAS保证
具体例子待总结
https://segmentfault.com/a/1190000017372067
网友评论