轻量级锁的加锁

  1. 线程在执行同步块之前,JVM会先在当前线程的栈桢中分配存放锁记录的空间,并将对象头的Mark Word 复制一份到锁记录中
  2. 然后线程尝试使用CAS将对象头中的Mark Word 中的指向锁记录的指针,指向当前线程的锁记录
  3. 如果CAS成功,当前线程获取锁,否则尝试使用自旋的方式获取锁

注意:自旋的目的是为了减少线程挂起的次数,尽量避免直接挂起线程(挂起操作涉及系统调用,存在用户态和内核态切换,这才是重量级锁最大的开销)

轻量级锁的解锁

  1. 尝试使用CAS操作,将之前复制到锁记录的Mark Word替换会对象头

    轻量级锁的膨胀

  2. 轻量级锁竞争时,另一个线程尝试使用自旋的方式获取锁,获取一段时间后还是失败,则锁膨胀为重量级锁