JVM锁升级过程分析

2020-05-27  本文已影响0人  cbhe

过程概括

  1. 从未被获取过得锁:无锁状态
  2. 只被一个线程获取的锁:偏向锁
  3. 多个线程获取锁,但并没法生锁等待:轻量级锁
  4. 多个线程出现锁竞争:重量级锁(也就是一般意义的锁)

举个栗子

你家有一个碗,当没有人用这个碗时,它处于无锁状态。当你用这个碗吃饭时,它进入偏向锁状态,以后每次你用这个碗吃饭的话,你都不用进行加锁和解锁操作。有一天你女朋友去你家,但她只要求你吃完了再把碗给她用,你们虽然共用这一个碗,但是并不会在同一时间用,这是碗就进入了轻量级锁。但当你正在用碗吃饭的时候,你女朋友说她也饿了,要抢你的碗,这时候,你只能给碗加上重量级锁,才能避免你女朋友直接来抢你的失误。

锁升级的数据结构

HotSpot虚拟机将每个对象的加锁信息和当前状态存储在对象头的mark word字段,结构如下:


图1 HotSpot虚拟机对象头Mark Word格式

HotSpot虚拟机的对象头分为两部分,第一部分用于存储对象自身的运行时数据,如HashCode、GC分代年龄等。这部分数据在32位和64位的java虚拟机中分别占用32位和64位,官方称之为Mark World。这部分时实现轻量级锁和偏向锁的关键。另一部分用于存储指向方法区对象类型数据的指针,如果是数组对象,还会有额外的部分用于存储数组的长度。

锁升级过程

上一篇 下一篇

猜你喜欢

热点阅读