锁升级的过程

锁升级的过程
(挡住的是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。