题目描述

来聊聊锁升级。

个人回答

心理:啊?啥?锁?还升级。
回答:不好意思,这个不会。
默默离开。

知识整理

四种锁状态简介

  1. 无锁状态:就是没有加锁,就没有synchronize()过
  2. 偏向锁:只有一个线程访问同步代码块时
  3. 轻量级锁(自旋锁):线程不太多,竞争不太激烈时使用
  4. 重量级锁:竞争激烈时,需要切换内核态

image.png

记录锁的位置

synchronize关键给某个对象上锁的方式就是修改该对象在内存中的对象头中Mark Word信息。
image.png
image.png

锁升级过程

  1. 对象刚刚被创建,Mark Word中的锁标志位为 01 ,是否偏向锁 0
  2. 对象被synchronize关键字使用,当第一个线程进入后,锁升级为偏向锁,是否偏向锁 1。并且当前线程的指针被记录到该对象的Mark Word中。
  3. 有两个及以上的线程共同去执行同步代码块了。此时使用轻量级锁了,自旋锁(准确的说应该是自适应锁),两个线程通过CAS将,MarkWord中指向线程栈中Lock Record指针

image.png

  1. 最后,竞争太激烈了,自旋次数太多后,自动升级为重量级锁,加锁需要从用户态切换到内核态,Mark Word中会记录互斥量(信号量1)的指针。未竞争到锁的线程,操作系统安排到队列中。

    再次回答

    • 算了,不会。