锁升级的过程
(挡住的是1)

这些信息全部记录在markword的8个字节中。Markwork中记录了锁信息和GC信息。

升级过程

  1. 无锁态-偏向锁:第一个来的线程,只需要给锁贴一个标签(把markword的线程ID改成自己线程ID的过程:当前线程的指针),效率高。
  2. 偏向锁-轻量级锁(自旋锁,无锁,自适应自旋):又来了一个线程竞争时(只要有竞争时),将之前贴的标签撕掉(撤销偏向锁),在自己的线程栈生成Lock Record,两个线程采用自旋的方式(CAS)去修改指针,修改为指向自己线程栈的Lock Record指针。谁抢成功就指向谁的。轻量级锁执行在用户态。
  3. 轻量级锁-重量级锁:当有的进程自旋超过10次,或者自旋线程数超过CPU核数的1/2,升级为重量级锁。JDK1.6加入自适应自旋Adapative self spinning,JVM可以自己判断是否升级。重量级锁需要用户态向内核态申请重量级锁,指向重量级锁的指针。每个重量级锁下面有一个队列,当没有轮到某个线程执行时,放在等待队列中,线程处于wait状态,不消耗任何CPU。

相关文章:

  • 2021-07-21
  • 2021-04-09
  • 2022-01-04
  • 2021-08-28
  • 2022-12-23
  • 2021-09-07
  • 2021-11-01
猜你喜欢
  • 2021-06-02
  • 2022-12-23
  • 2021-12-12
  • 2022-01-28
  • 2022-12-23
  • 2021-10-09
  • 2021-11-28
相关资源
相似解决方案