查了很多关于偏向锁的资料,关于偏向锁的获取流程。
首先如果偏向标志位为0说明处于无锁状态,直接CAS获取偏向锁,成功则获得偏向锁,失败说明存在竞争,膨胀为轻量级锁。
如果偏向标志位为1说明处于可偏向状态,此时判断偏向线程ID是否为当前线程ID,如果是则直接执行代码块,如果不是,则执行CAS操作竞争偏向锁。我的疑问就在这里?CAS是怎么交换的,直接把ThreadAID更新ThreadBID吗?这样的话如果没有ThreadC参与的话不是必定成功的吗?但是如果ThreadA还在同步代码块内,ThreadB直接CAS把偏向锁改为自己不是产生并发问题了吗?
还是说是ThreadB发现偏向线程ID不是自己后,会通知JVM,然后JVM在到达安全点之后判断ThreadA是否存活,如果不存活则进行锁撤销,ThreadB重新通过CAS进行竞争偏向锁,如果存活则膨胀为轻量级锁。如果是这种的话ThreadB发现偏向线程ID不是自己后会暂停ThreadA吗,还是说并不会暂停ThreadA直到安全点。如果暂停那么暂停ThreadA以及判断ThreadA是否存活,进行锁撤销是JVM的动作吗?还是由ThreadB完成。
希望大佬解惑。