(十九)AQS实现原理(具体例子待总结)

2020-11-04  本文已影响0人  hedgehog1112

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

上一篇下一篇

猜你喜欢

热点阅读