Go锁
2021-07-19 10:19:58 0 举报
go锁流程图
作者其他创作
大纲/内容
结束
状态值为0?
唤醒协程
否
锁定
如果该协程为被唤醒的协程?
是
本协程成为被唤醒的协程。能够阻止锁释放时再唤醒其它协程
无等待
状态的唤醒位置1成功?
无唤醒
加锁
?
该协程已是饥饿状态且锁已被占用?
获取到锁、等待协程数量减1,判断是否重置饥饿状态
锁状态为饥饿状态?
未唤醒
锁没有唤醒的协程、本协程不是唤醒的协程、等待队列里有协程?
状态正常?
Lock()
正常
自旋
状态为饥饿或者已锁定?
该协程是否处于饥饿状态?
直接解锁
自旋次数加1获取最新的状态
CAS新状态替换老状态成功?
?
老状态为未锁定且正常?
循环尝试加锁
状态的等待值+1
状态唤醒位置0
状态为正常、锁定,且可自旋?
未锁定
状态不为0?
唤醒
CAS加锁
将该协程放入等待队列并挂起
状态改为饥饿
Unlock()
0 条评论
下一页