Synchronized 锁升级过程

2021-01-16  本文已影响0人  Ella_Eric

对象结构

Java 对象存储在堆中,那么一个java对象在内存中的结构哪些信息呢?包含对象头,对象体和对齐字节,以下是一个java对象在32位操作系统中的结构


image.png

对象头

对象体

对齐字节

Synchronized 锁优化

锁状态有四种,其中偏向锁和轻量级锁都是在用户态,而重量级锁需要向操作系统申请,在内核态。

偏向锁

为什么要引入偏向锁

如何上偏向锁

偏向锁升级

如何取消偏向锁

轻量级锁

为什么要引入轻量级锁

上轻量级锁过程

  1. 将竞争的变量值拷贝本线程的内存
  2. 在本线程计算结果
  3. 比较竞争变量在1中的值和当前值, 如果一致,说明没有其他进程改写(也可能改写了但是值一样),将2中计算的值填入变量中。如果1中的值和现在的值不一样,那么回到第一步重新自旋,直到改写变量成功为止。对于其他进程改变了变量的值,只是值一样,如果需要考虑这种情况为竞争过,可以为变量值加一个版本号。

轻量级锁升级

*注意:为了避免无用的自旋,轻量级锁一旦膨胀为重量级锁就不会再降级为轻量级锁了;偏向锁升级为轻量级锁也不能再降级为偏向锁。一句话就是锁可以升级不可以降级,但是偏向锁状态可以被重置为无锁状态。

重量级锁

重量级锁需要向操作系统申请,程序从用户态-> 内核态 -> 用户态。上重量级锁后,对于没有获得锁的线程,将会根据优先级到锁的队列里进行排队,队列里的线程将会处于睡眠状态,获得锁之后会被操作系统唤醒。对于多个CPU来说,一个CPU可以通过锁住总线来防止其他CPU改写数据。

synchronized 锁升级过程

锁升级过程大致如下


image.png

参考文献

上一篇 下一篇

猜你喜欢

热点阅读