多线程-ReentranLock的流程
2021-07-09 22:14:22 0 举报
多线程-ReentranLock的流程
作者其他创作
大纲/内容
false
公平锁
true
等待对列是否还有线程等待
有参
创建Node线程节点
获取到锁,执行锁区域的代码
cas设置头节点
锁的创建
创建Node细节链表结构
线程A
重入锁判断
ReentranLock()
唤醒对列中等待的线程
无参
state == 0(无锁)
设置exclusiveOwnerThread为当前线程(持有锁)
state = state+1
current == getExclusiveOwnerThread()
获取当前线程Thread.currentThread()获取当前锁状态state
移除当前等待节点(调整链表结构)
非公平锁
cas操作设置当前线程节点为尾结点
否
是
检查调用的线程是否是当前正在运行的线程
尝试获取锁
cas尝试修改state
创建重入锁
(state - 1 )==0
自旋
setExclusiveOwnerThread(null) 当前独占线程为null设置state = 0
acquireQueued
setExclusiveOwnerThread(null) 当前独占线程为null设置state = state - 1
没有
检查是否有尾结点
LockSupport.park(this)(挂起当前线程)
上一个节点是否是头节点
lock.unLock()
设置当前节点的上一个节点为之前的尾结点
线程重入,做减法
检查是否有等待对列
有
阻塞interrupted = true;
lock.lock()
抛出异常IllegalMonitorStateException
检查头节点是否为空
检查是否需要挂起
0 条评论
回复 删除
下一页