首页 > 应用开发 > Java > java多线程之synchronized锁的实现原理
java中synchronized是由JVM层实现的锁,而Lock的实现完全是由JAVA层实现,jdk 1.5之前synchronized是重量级锁实现,效率比较低,经过JVM·的优化,jdk1.5版本及后synchronbized的锁效率已经和Lock差不多。
下面通过一个简单demo展示下
上面的demo的字节码如下,可以看到synchronized关键字的括号包含的代码锁对应的字节码开始前嵌入monitorenter,末尾嵌入monitorexit指令。
那么monitorenter和monitorexit指令是如何作用的呢 想要弄清楚这个问题,首先还是得了解Java得对象头(基于64位操作系统)
其中对象头中MarkWord中锁标志位就是表示对象锁的状态的,如上图所示
自从jdk1.5之后,JVM就对synchronized进行了优化,那么它是如何优化成现在 几乎和ReentrantLock性能差不多的呢,那么加下来往下看' 下面是monitorenter和monitorexit指令的经过编译器执行对应的代码的位置 src/hotspot/share/interpreter/interpreterRuntime.cpp
从上面知道monitorenter指令是调用ObjectSynchronizer::enter加锁,对应源码位置是src/hotspot/share/runtime/synchronizer.cpp 首先主要看下enter的加锁的方法
1.判断是否开启偏向锁,handle_sync_on_value_based_class同步处理偏向锁处理
2.如果对象头中MarkWord中没有锁,则先将对象头写入当前线程的栈中,通过CAS将把 MarkWord中对应位置更新为header的指针
3.如果对象头中markword已经存在锁,则通过inflate进行膨胀,尝试获取重量级锁, (即使用ObjectMonitor进行加锁)
总结
今天主要对Java中synchronized关键字的底层原理的分析,对于jdk的对于它的锁优化原理, 由无锁-->偏向锁-->轻量级锁(CAS)-->重量级锁(OjectMonitor)有一个清晰的认识。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70000430/viewspace-2788707/ ,如需转载,请注明出处,否则将追究法律责任。