synchronized原理及锁升级过程
2022-04-09 18:09:56 1 举报
synchronized 概述、作用、底层原理 以及锁升级过程
作者其他创作
大纲/内容
acquire
No
轻量级锁膨胀为重量级锁
概述:
对象头
6. 结束 (Terminated) 线程执行结束
release and exit
竞争锁对象
几种锁的优点和缺点
线程通信状态
偏向锁原理和升级过程
锁记录空间
Yes
💡
_Owner
release
CAS替换?
blocking
Waiting
开始执行方法体
_WaitSet
轻量级锁原理和升级过程
作用:
复制Mark Word 信息
对象头中记录当前线程ID
判断锁对象记录的threadID线程是否存活?
使用:
thread1
复现指令重排导致的bug
synchronized
_Owner 区
②
③
复制对象头中的Mark Word的信息到该线程栈帧的锁记录空间中,同时替换对象头中的_own为当前线程锁记录的地址。
Running
是否有其他线程竞争?
作用
ObjectMonitor(){ _count = 0; //记录数 _recursions = 0; //锁的重入次数 _owner = NULL; //指向持有ObjectMonitor对象的线程 span style=\"font-size: inherit;\
偏向锁膨胀为轻量级锁
enter
_EntryList
代表正在等待的线程
到达自旋阈值
对象头中包含Mark Word 标记字段、Klass Pointer 类型指针以及包括GC所需的分代年龄。span style=\"font-size: inherit;\
❓
对象结构
monitor对象的获取
⑤
锁升级过程流程图
Monitor对象
是否为轻量级锁?
2. 运行 (Runnable) Runnable包括了操作系统线程状态中的Runnable和Ready。
synchronized锁有四种状态:无锁、偏向锁、轻量级锁、重量级锁。这几个状态会随着竞争状态逐渐升级,锁可以升级但不能降级,但是偏向锁状态可以被置为无锁状态。
代表正在执行的线程
填充数据
实例数据
判断锁对象中是否有threadID?
偏向锁
锁的升级过程
Blocking
Mark Word
替换_Owner地址
④
判断锁对象记录的threadID线程是否需要该锁对象?
底层原理
①
0 条评论
下一页