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
转载请注明:这不是一只猫的博客 » 点击阅读原文