续
2. 轻量级锁 倘若偏向锁失败, 虚拟机并不会立即升级为重量级锁 ,它还会尝试使用一种称为轻量级锁的优化手段(1.6之后加入的)。轻量级锁不是为了代替重量级锁,它的本意是 在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗,因为使用轻量级锁时,不需要申请互斥量 轻量级锁能够提升程序同步性能的依据是“对于绝大部分锁,在整个同步周期内都是不存在竞争的”,这是一个经验数据。如果没有竞争,轻量级锁使用 CAS 操作避免了使用互斥操作的开销。 但如果存在锁竞争,除了互斥量开销外,还会额外发生CAS操作,因此在有锁竞争的情况下,轻量级锁比传统的重量级锁更慢! 如果锁竞争激烈,那么轻量级将很快膨胀为重量级锁! 当有另外一个线程竞争锁时,由于该锁处于 偏向锁 状态 发现对象头Mark Word中的线程ID不是自己的线程ID,该线程就会执行CAS操作获取锁 如果获取 成功 ,直接替换Mark Word中的线程ID为自己的线程ID,该锁会***保持偏向锁状态*** 如果获取 失败 ,说明当前锁有一定的竞争,将偏向锁 升级 为轻量级锁 线程获取轻量级锁的步骤: 在加锁前,虚拟机需要在当前线程的栈帧中建立 锁记录 (Lock Record)的空间。Lock Record 中包含一个 _displaced_header 属性,用于存储锁对象的 Mark Word 的拷贝。