Java虚拟机支持方法级的同步和方法内部一段指令序列的同步,两种同步结构都使用管程(Monitor,或直接称为锁)来实现。
synchronized修饰的方法属于方法级同步,方法级的同步是隐式的,无须通过字节码指令来控制,实现在方法调用和返回中。在Class文件中同步的方法用ACC_SYNCHRONIZED标识,方法调用时会先检查是否设置了这个字段,如果存在,执行线程需要先成功持有管程Monitor,才能执行方法。正常退出方法或者抛出异常都会自动释放管程Monitor。
synchronized同步代码块,Java虚拟机的指令集中有monitorenter和monitorexit两条指令支持关键字synchronized语义,两条指令之间的部分就是同步的代码块逻辑的字节码指令。
两者本质上都是对一个对象的管程Monitor进行获取,管程Monitor存储在Java的对象头Mark Word中。
在HotSpot虚拟机底层C++实现中,oopDesc类是Java对象的顶级基类,其中定义着对象头数据结构,所以每一个Java对象都包含对象头。锁对象(管程Monitor)是一个定义的ObjectMonitor结构,HotSpot虚拟机采用ObjectMonitor类来实现Monitor。
网友评论