Synchronized偏向锁源码分析
2025-02-26 15:27:44 0 举报
Synchronized偏向锁源码分析,分享给大家学习。 更多干货内容,欢迎关注我的公众号:Fox爱分享
作者其他创作
大纲/内容
不在安全点
JVM中的字节码解释器(bytecodeInterpreter),用C++实现了JVM指令monitorenter,其优点是实现相对简单且容易理解,缺点是执行慢。
轻量级锁逻辑
偏向锁的撤销 只有当其它线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁
判断是否不在全局安全点
sychronized解锁逻辑
false
monitorenter指令
偏向锁逻辑
BiasedLocking::revoke_at_safepoint(obj);
_monitorexit指令
macroAssembler_x86.cpp#MacroAssembler::biased_locking_enter
templateTable_x86_64.cpp#TemplateTable::monitorenter
模板解释器(templateInterpreter),其对每个指令都写了一段对应的汇编代码,启动时将每个指令与对应汇编代码入口绑定,可以说是效率做到了极致。
如果是撤销和重偏向状态直接返回
true
if (UseBiasedLocking)
bytecodeInterpreter.cpp#CASE(_monitorenter)
bytecodeInterpreter.cpp#CASE(_monitorexit)
sychronized加锁逻辑
if (!SafepointSynchronize::is_at_safepoint())
偏向锁延迟偏向
偏向锁入口
在安全点
只会在JVM启动的时候调用此方法生成汇编代码,之后对指令的解析是直接执行汇编代码
interp_masm_x86_64.cpp#InterpreterMacroAssembler::lock_object
BiasedLocking
判断是否开启偏向锁
if (cond == BiasedLocking::BIAS_REVOKED_AND_REBIASED) { return; }
UseBiasedLocking标识虚拟机是否开启偏向锁功能,如果开启则执行fast_enter逻辑,否则执行slow_enter
JavaThread thread指向java中的当前线程 BasicObjectLock类型的elem对象包含一个BasicLock类型_lock对象和一个指向Object对象的指针_objBasicLock类型_lock对象主要用来保存_obj指向Object对象的对象头数据

收藏

收藏
0 条评论
下一页