关键字Synchronized:
语义底层是通过一个monitor来完成的。
Jvm基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用monitorenter和monitorexit指令实现的,而方法同步是使用另外一种方式实现(依靠方法修饰符上的ACC_SYNCHRONIZED),但是,方法同步同样可以使用这两个指令实现。无论哪种方式,其本质是对一个对象的监视器(monitor)进行获取,而这个获取过程是排他的,也就是同一时刻只能有一个线程获取到又synchronized所保护对象的监视器。。
monitorenter指令是指在编译后插入到同步代码块的开始位置,而monitorexit是插入到方法结束和异常处,JVM要保证每个monitorenter必须有对应的monitorexit与之配对。任何对象都有一个monitor与之关联,当且一个monitor被持有后,它将处于锁定状态。线程执行到monitorenter指令时,将会尝试获取对象所对应的monitor的所有权,即尝试获得对象的锁。
java并发知识
最新推荐文章于 2024-11-03 23:42:08 发布