同步指令
Java
虚拟机可以支持方法级的同步和方法内部一段指令序列的同步,这两种同步结构都是
使用管程(Monitor
,更常见的是直接称为“锁”)来实现的。
方法级别的同步
方法级的同步是隐式的,无须通过字节码指令来控制,虚拟机可以从方法常量池中的
方法表结构中的ACC_SYNCHRONIZED
访问标志得知一个方法是否被声明为同步方法。
当方法调用时,调用指令将会检查方法的ACC_SYNCHRONIZED
访问标志是否被设置,
如果设置了,执行线程就要求先成功持有管程,然后才能执行方法,最后当方法完成时释放管程。
同步一段指令序列
通常是使用synchronized
语句块来表示,Java
虚拟机的指令集中有monitorenter
和monitorexit
两条
指令来支持synchronized
关键字的语义。