sychronized设计原理

synchronized底层对应的JMM模型8大原子操作lock与unlock

sychronized设计原理_第1张图片

 

 synchronized原理分析

加锁

  • 同步实例方法,锁是当前实例对象
  • 同步类方法,锁是当前类对象
  • 同步代码块,锁是括号里面的对象

原理:

JVM内置锁通过synchronized使用,通过内部对象Monitor(监视器)实现,基于进入与退出Monitor对象实现方法与代码块同步,监视器锁的实现依赖于底层操作系统的Mutex Lock(互斥锁)实现,它是一个重量级锁性能较低

sychronized设计原理_第2张图片

 

 Monitor

每个同步对象都有一个自己的Monitor(监视器锁)

JVM加锁过程:

sychronized设计原理_第3张图片

 

 锁的升级优化过程

  • JDK1.6版本之后对synchronized的实现进行了各种优化,如适应性自旋锁、轻量级锁和偏向锁,并默认开启偏向锁
  • 开启偏向锁: -XX:+UseBiasedLocking -XX:BiaseLockingStartupDelay=0
  • 关闭偏向锁:-XX:-UseBiasedLocking

sychronized设计原理_第4张图片

 

*使用重量级锁 才会去使用monitor

 

synchronized 锁升级原理:

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

锁的升级的目的:

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

你可能感兴趣的:(sychronized设计原理)