2.
轻
量
级锁
(
1
)
轻
量
级锁
加
锁
线
程在
执
行同步
块
之前,
JVM
会先在当前
线
程的
栈桢
中
创
建用于存
储锁记录
的空
间
,并
将
对
象
头
中的
Mark Word
复制到
锁记录
中,官方称
为
Displaced Mark Word
。然后
线
程
尝试
使用
CAS
将
对
象
头
中的
Mark Word
替
换为
指向
锁记录
的指
针
。如果成功,当前
线
程
获
得
锁
,如果失
败
,表示其他
线
程
竞
争
锁
,当前
线
程便
尝试
使用自旋来
获
取
锁
。
(
2
)
轻
量
级锁
解
锁
轻
量
级
解
锁时
,会使用原子的
CAS
操作将
Displaced Mark Word
替
换
回到
对
象
头
,如果成
功,
则
表示没有
竞
争
发
生。如果失
败
,表示当前
锁
存在
竞
争,
锁
就会膨
胀
成重量
级锁
。

因
为
自旋会消耗
CPU
,
为
了避免无用的自旋(比如
获
得
锁
的
线
程被阻塞住了),一旦锁升
级
成重量
级锁
,就不会再恢复到
轻
量
级锁
状
态
。当
锁处
于
这
个状
态
下,其他
线
程
试图获
取
锁时
,
都会被阻塞住,当持有
锁
的
线
程
释
放
锁
之后会
唤
醒
这
些
线
程,被
唤
醒的
线
程就会
进
行新一轮
的
夺锁
之争。
