sychronized设计原理

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

 synchronized原理分析

加锁

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

原理:

synchronized标记的对象在编译为指令的时候,是被moniterenter和moniterexit所包装的,monitor对象是同步的基本实现单元。在jdk1.6之前,monitor的实现是通过操作系统内部的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个重量级的操作,性能很低。jdk1.6之后,提供了三种montor实现,也就是常说的三种不同的锁(偏向锁、轻量级锁、重量级锁)

 Monitor

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

JVM加锁过程:

 锁的升级优化过程

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

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

synchronized 锁升级原理:

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

锁的升级的目的:

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

当你发现自己的才华撑不起野心时,就请安静下来学习吧
原文地址:https://www.cnblogs.com/smallVampire/p/12599628.html