从字节码角度分析synchronized实现
javap -c(v附加信息) ***.class 文件反编译
synchronized同步代码块
>>>实现使用的是monitorenter和monitorexit指令
synchronized普通同步方法
>>>调用指令将会检查方法的ACC_SYNCHRONIZED访问标志是否被设置,如果设置了,执行线
程会将现持有monitor锁,然后再执行该方法,最后在方法完成(无论是否正常结束)时释放
monitor
synchronized静态同步方法
>>>ACC_STATIC、ACC_SYNCHRONIZED访问标志区分该方法是否是静态同步方法
反编译synchronized锁的是什么
面试题:为什么任何一个对象都可以成为一个锁?
C++源码:ObjectMonitor.java--->ObjectMonitor.cpp--->ObjectMonitor.hpp
每个对象天生都带着一个对象监视器,每一个被锁住的对象都会和Monitor关联起来
总结:指针指向Monitor对象(也称为管程或监视器)的真实地址。每个对象都存在着一个monitor
与之关联,当一个monitor被某个线程持有后,它便处于锁定状态。在Java虚拟机(HotSpot)中,
monitor是由OnjectMonitor实现的,其主要的数据结构如下(位于HotSpot虚拟机源码
ObjectMonitor.hpp文件,C++实现):