Synchronized锁升级、降级

多线程中锁的升级

synchronized锁升级原理:在锁对象的对象头里面有一个threadid字段,在第一次访问的时候threadid为空,jvm 让其持有偏向锁,并将threadid 设置为其线程id,再次进入的时候会先判断threadid是否与其线程id一致,如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了synchronized 锁的升级。

锁的升级的目的

锁升级是为了减低了锁带来的性能消耗。在Java 6之后优化 synchronized的实现方式,使用了偏向锁升级为轻量级锁再升级到重量级锁的方式,从而减低了锁带来的性能消耗。

多线程中锁的降级

我注意到有的观点认为Java不会进行锁降级。实际上据我所知,锁降级确实是会发生的。

具体的触发时机:在全局安全点(safepoint)中,执行清理任务的时候会触发尝试降级锁
当锁降级时,主要进行了以下操作:

  • 恢复锁对象的markword对象头;
  • 重置ObjectMonitor,然后将该ObjectMonitor放入全局空闲列表,等待后续使用。

你可能感兴趣的:(java基础,synchronized,锁的升级降级)