synchronized深度详解

89 阅读1分钟

锁升级步骤

image.png

锁重入

重入次数必须记录,因为要解锁几次必须得对应。

偏向锁记录在线程栈中,即LockRead简称LR,LR中指针指向用来做备份得MarkWord,第一个LR记录有备份MarkWord,如果再上锁,就会再记录一个LR,此时不需要再记录备份得MarkWord,以此类推,解锁得时候即出栈。

自旋锁什么时候升级为重量级锁

  1. 竞争加剧:有线程超过10此自旋,-XX:PreBlockSpin,或自选线程数超过CPU核数得一半,1.6之后加入自适应自旋锁,JVM自己控制
  2. 升级重量级锁:向操作系统申请资源,linux mutex,CPU从3级--0级系统调用,线程挂起,进入等待对列,等待操作系统得调度,然后再映射会用户空间

重量级锁有等待对列,所有拿不到锁得进入等待对列,不需要消耗CPU资源

偏向锁启动和偏向锁未启动 再多线程竞争得情况下,偏向锁肯定会涉及锁撤销,这时候直接使用自旋锁。JVM启动过程,会有很多线程竞争(明确),所以默认情况启动时不打开偏向锁,过一段时间才打开。

偏向锁启动延时,一般是4秒钟。