concurrent
2025-01-06 23:41:43 0 举报
java并发相关, ReentrantLock
作者其他创作
大纲/内容
Time Waiting
Node
hashCode
Task
thread = T1
1
LockSupport.park(timeout)
epoch
AQS
0
核心线程(正式工)
prev
next
nextWaiter = null
waitStatus = -2
数组
Object Waiting
后继节点
00
加锁失败
thread = T2
thread = T3
BLOCKED阻塞
state = 1
thread = null
睡眠结束
assign
TheadId
waitStatus = 0
T2
await
数组长度
Worker
CLH
lastWaiter
initFlag = true
前驱结点
t.start()
T3
waitStatus = -1
总线嗅探
TERMINATED终止
initFlag = false -> true
age
T1
01
CLH同步阻塞队列:1. FIFO: 先进先出2. 双向指针: 每个Node结点都有prev前驱节点和next后继节点3. nextWaiter = null: 表示独占锁4. waitStatus = -1 表示后继节点可以唤醒
synchronized
exclusiveOwnerThread = T1
主动wait
终止Dead
得到时间片
ThreadPoolExecutor
抢锁成功
exclusiveOwnerThread = T3
put(\"4\
实例数据
initFlag = false
Mark Word
head
.....
store
Resource Blocked
firstWaiter
t.sleep(timeout)
state = 4
CPU时间片段用完
WAITING等待
Thread Id
创建锁对象
获得CPU时间片段
解锁
就绪Runnable
start
完成或取消
Tread-1while(!initFlag)
load
入队
重偏向
不支持偏向锁或者不满足延迟偏向的条
操作系统线程
java线程状态
Tread-2
JMM模型
主内存
tail
write
put(\"1\
read
偏向锁撤销: 未锁定
阻塞Blocked
抢锁失败
条件队列: ConditionObject 单向链表
运行Running
Ready
元数据指针
use
Epoch
obj.wait()
工作内存
I/O总线
开始
1.I/O释放2. 同步块释放3. 获得锁
锁状态01
1. I/O阻塞2.同步块阻塞3. 锁阻塞
t2
Running
指向lock record的指针
waitStatus =
OOP
指向头结点
t.join()
Thread-2initFlag = false-> true
10
NEW新建
轻量级锁状态
101
LockSupport.park()
偏向锁状态未锁定:没有绑定threadId
t.yield() / 时间片用完
通过CAS将threadId设置到锁对象的MarkWord中
非核心线程(临时工)
指向尾结点
偏向锁状态0 / 1
notify唤醒
obj.wait(timeout)
延迟偏向4s
对象头
TIME_WAITING超时等待
thread = T0
红黑树 TREEIFY_THRESHOLD = 8
加锁成功
指向monitor的指针
exclusiveOwnerThread = T2
对象的hashCode
对齐填充
重量级锁状态
Thread t = new Thread()
1. 提交优先级2. 执行优先级3. 存活时间 (线程回收)4. 线程复用5. 拒绝策略6. ThreadFactory7. corePoolSize和maximumPoolSize的区别
偏向锁撤销: 绑定线程同步代码快中调用hashCode或wait方法
释放锁
偏向锁撤销: 绑定线程
主动睡眠
RUNNABLE可运行
Tread-1
链表
signal - waitStatus=0前驱节点的waitStatus改为 -1nextWaiter = null
0 条评论
下一页