1.偏向锁升级轻量级锁
a.访问Mark Word中偏向锁的标识是否设置成1,锁标志位是否为01,确认为可偏向状态。
b.如果为可偏向状态,则测试线程ID是否指向当前线程,如果是,进入步骤e,否则进入步骤c。
c.如果线程ID并未指向当前线程,则通过CAS操作竞争锁。如果竞争成功,则将Mark Word中线程ID设置为当前线程ID,然后执行e;如果竞争失败,执行d。
d.如果CAS获取偏向锁失败,则表示有竞争。当到达全局安全点(safepoint)时获得偏向锁的线程被挂起,偏向锁升级为轻量级锁,然后被阻塞在安全点的线程继续往下执行同步代码。(撤销偏向锁的时候会导致stop the word)
e.执行同步代码。
2.轻量级锁升级到重量级锁
a.线程在执行同步块之前,JVM会先在当前线程的栈桢中创建用于存储锁记录的空间,并将对象头中的Mark Word复制到锁记录中,线程尝试使用CAS将对象头中的Mark Word替换为指向锁记录的指针。成功,当前线程获得锁,失败,表示其他线程竞争锁,当前线程便尝试使用自旋来获取锁。
b.轻量级解锁时,会使用原子的CAS操作将Displaced Mark Word替换回到对象头,如果成功,则表示没有竞争发生。失败,表示当前锁存在争,锁就会膨胀成重量级锁。
重量级锁这个状态下,其他线程试图获取锁时,都会被阻塞住,当持有锁的线程释放锁之后会唤醒这些线程,被唤醒的线程就会进行新一轮的夺锁之争