JVM层面的不同
1)同步方法,JVM采用ACC_SYNCHRONIZED标记符来实现同步
详解:
a.方法级的同步是隐式的,同步方法的常量池中会有一个ACC_SYNCHRONIZED标志。
b.当某个线程要访问某个方法时,会检测是否有ACC_SYNCHRONIZED,如果有,则需要先获得监视器 锁,然后开始执行方法,方法执行之后再释放监视器锁。
c.这时如果其他线程来请求执行方法,会因为无法获得监视器锁而被阻断
d.如果方法执行过程中,发生异常,并且方法内部没有异常处理,那么在一次呗跑到方法外面之前,监视器锁会被自动释放
2)同步代码块,JVM采用monitorenter、monitorexit两个指令来实现同步
详解:
a.可以把执行monitorenter理解为加锁,执行monitorexit理解为释放锁
b.每个对象维护着一个记录着被锁次数的计数器,未被锁定的对象的该计数器为0
c.当一个线程获得锁后,该计数器自增1,当同一个线程再次获得该对象的锁时,计数器再次自增
d.当同一个线程释放锁时,计数器再自减。
e.当计数器为0时,锁被释放,其他线程便可以获得锁