?Synchronized底层实现---偏向锁

Posted charlottepl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了?Synchronized底层实现---偏向锁相关的知识,希望对你有一定的参考价值。

偏向锁入口

synchronized分为synchronized代码块和synchronized方法,其底层获取锁的逻辑都是一样的。

要找到锁的入口,就要找到代码中对monitorenter指令解析的地方。在HotSpot中有两处对monitorenter进行了解析:一个是在bytecodeInterpreter.cpp#1816 ,另一个是在templateTable_x86_64.cpp#3667。

  • bytecodeInterpreter是JVM中的字节码解释器,用C++实现了每一条jvm指令,如monitorenter,其优点是实现简单且比较容易理解,缺点是执行慢,后者是模板解析器templateInterpreter,他对每个指令都写了一段对应的汇编语言,启动时将每个指令和对应的汇编语言入口绑定,可以说将效率做到了极致,参考文章。在HotSpot中,只用到了模板解释器,所以,monitorenter的解析入口在

HotSpot

在HotSpot中,实现了两种具体的解释器,即模板解释器和C++解释器,它们分别由TemplateInterpreter子模块和CppInterpreter子模块实现。其中,模板解释器正是目前HotSpot的默认解释器.另外就是其实HotSpot从一开始就有模板解释器,而C++解释器反而是后来加进来的。前者源于HotSpot的前身Strongtalk,而后者源于Sun的另一个JVM——CVM,又名“CDC HotSpot Implementation”或者“CDC-HI”。CVM更早的前身是Sun的Classic VM。
也就是说,这俩解释器没有任何血缘关系,前者并非将后者翻译为汇编。当时Sun之所以把后者加到HotSpot是在实现Itanium(IA-64)的移植时想偷懒,人肉写Itanium汇编挺烦的所以要实现Itanium版模板解释器不方便,他们就想到了把CVM的解释器移植过来,这样可以少写点汇编就能完成移植。结果一直以来HotSpot能运行的平台上只有Itanium版是真的用了这个C++解释器的,而其它平台上默认都在用模板解释器,但还是可以通过编译参数选择使用C++解释器。


以上是关于?Synchronized底层实现---偏向锁的主要内容,如果未能解决你的问题,请参考以下文章

Java synchronized锁的底层实现概述

Java并发编程:Synchronized底层优化(偏向锁轻量级锁)

synchronized底层实现

从刷面试题到构建知识体系Java底层-synchronized锁-2偏向锁篇

Synchronized的底层实现

synchronized原理及1.6之后的锁升级优化