线程-AQS杂记

ReentrantLock内部有两个Sync(NonfairSync和FairSync)实现了AbstractQueuedSynchronizer

AbstractQueuedSynchronizer内部有Node,用于实现FIFO队列,链表形式

AbstractQueuedSynchronizer state字段表示资源,=1表示获取到资源即获取到锁,用compareAndSetState自旋的方式设置值

Node waitStatus字段表示状态,重要的是SIGNAL状态,在此状态下会被LockSupport.park

lock.lock 锁住和唤起主要是通过LockSupport.park和LockSupport.unpark实现

ReentrantLock内部 公平锁和非公平锁主要区别是hasQueuedPredecessors这里的区别,表示队列是否为空或则是否有前驱

大致流程是先获取锁->失败就加到队列尾部调用LockSupport.park阻塞->当有lock.release的时候会调用LockSupport.unpark(node.next.thread)

shouldParkAfterFailedAcquire compareAndSetWaitStatus(pred, ws, Node.SIGNAL) cas前驱的waitStatus

公平锁和非公平锁的主要区别是在锁release的时候,同时又有很多线程lock.lock,非公平锁会hasQueuedPredecessors判断一下

Condition相关

Condition实际上是ConditionObject,里面有firstWaiter和lastWaiter两个Node节点,用于组成队列

await的时候会 addConditionWaiter加入队列->fullyReleases释放锁(此时锁已经释放出现竞争,所以需要isOnSyncQueue(node)判断是否在队列里)->LockSupport.park阻塞

signal的时候去除第一个节点->transferForSignal->enq(node)->LockSupport.unpark

转载请注明:这不是一只猫的博客 » 点击阅读原文

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦