轻量级锁竞争的时候,还可以使用自旋来进行优化,如果当前线程自旋成功(即这时候持锁线程已经退出了同步块,释放了锁),这时当前线程就可以避免膨胀为重量级锁从而阻塞。

    注意图片有误,图片中的(重量锁)全部替换成(轻量锁),重量锁指针替换成轻量锁指针

    • 自旋重试成功

      image.png
      即线程2拿不到锁则开始利用另外的cpu2空转,反复尝试获取锁,注意此时线程2是运行态而不是阻塞态,因为阻塞态涉及到用户态和内核态的切换,消耗成本太高,适用于线程1占用锁的时间很短。如果只要单核cpu没有意义,因为没有cpu可用,此时cpu正在给线程1执行同步代码块。

    • 自旋重试失败的情况

      image.png
      此时线程2自旋试图拿到锁,但是线程1同步代码块没有执行完毕,即一直不释放锁,这时线程2才进入阻塞状态,进入Monitor的EntryList中等待。
      image.png