一图完解多线程的状态转移
2021-11-05 16:21:15 3 举报
深入了解多线程的状态转移,明白,java 中调用thread 相关的方法和多线程的状态
作者其他创作
大纲/内容
start()
hasQueuedPredecessors,检查当前队列是否为空
内部类,这里头的锁概念都是cas 实现的一个双向链表
sleep
ReadLock
FairSync
线程池
FairSync独占锁
系统自动唤醒
https://zhuanlan.zhihu.com/p/63595046
Nodethread
等待队列双向链表
AbstractQueuedSynchronizer
NonfairSync独占锁
把线程添加到等待队列中,并且一直循环检查是否是轮到当前线程 获取到 锁。
New
但是,是先进先出的队列来的
队列不为空
内部类 Sync
多线程 启动、状态流转
lock
wait()
WriteLock
ReenTrantLock
tryAcquire(1)
通过cas 来更新状态值
直接独占锁,设置当前独占线程为当前线程
Waiting
volatile int state
用户通过 notify 唤醒,重新取竞争锁,拿到锁了之后执行否则会进去等待队列
ReadWriteLock
notify()/notifyAll()
阻塞队列
不占用系统资源
TimedWaiting
队列为空
run() 结束
NonfairSync
synchronize
是
Terminated
Blocked
cas 修改state 失败
AQS.acquire(1)
Running
否
记录当前等待状态
检查是否state 是否为0,是:通过cas 修改state 成功后,设置当前线程为独占线程否:是否为当前线程 与 对列 执行中的线程为同一个线程,(可重入锁)
Lock
0 条评论
回复 删除
下一页