ReentrantLock jdk17
2024-04-05 20:45:38 1 举报
ReentrantLock jdk17 版本
作者其他创作
大纲/内容
获取失败
如果当前没有人获取到锁AbstractQueuedSynchronizer#tryAcquire
unlock解锁
release
公平
前置节点是否为头节点
修改下个节点的状态
没有
通过 cas 修改 state,并把当前线程设置到exclusiveOwnerThread
公平锁比非公平锁多判断了hasQueuedPredecessorsstate=0 队列不一定为空
直接cas尝试设置 state
state 为 0,队列没有等着的就会尝试获取一下
state 是否为 0,即是否有线程在等待
是
AbstractQueuedSynchronizer#tryAcquire
AbstractQueuedSynchronizer#hasQueuedThreads判断是否有队列在等待
没有获取到锁
获取锁
并通过 cas 尝试添加到同步队列队尾
如果是当前线程持有锁则添加重入次数
不等于 0
设exclusiveOwnerThread为 null如果 state 为 0 则返回 true
AbstractQueuedSynchronizer#acquire获取锁的核心方法下面逻辑是个死循环
非公平
最关键的方法,不管怎么调用都会来到这里
继续进行 acquire 里面的死循环
减完后 state 是否为 0
死循环
LockSupport.unpark唤醒线程
AbstractQueuedSynchronizer#signalNext
下次唤醒了上一个节点还在持有锁,那么自旋的次数翻倍
lock
创建一个 node node.waiter=当前线程
LockSupport#park阻塞,等待 unpark
tryRelease
是否有下一个节点,且status!=0
通过spins字段和Thread.onSpinWait();进行自旋
AbstractQueuedSynchronizer#acquire(int)
等于 0
state 为 0,就会尝试一下
ReentrantLock.Sync#initialTryLock
如果有中断则返回 true
0 条评论
下一页