1、synchronized是如何实现锁升级的?
Mark Word:
偏向锁的思想是偏向于让第一个获取锁对象的线程,这个线程在之后获取该锁就不再需要进行同步操作,甚至连 CAS 操作也不再需要。引入偏向锁是为了在无多线程竞争的情况下尽量减少不必要的轻量级锁执行路径。
偏向锁获取及升级过程:
(1)访问Mark Word中偏向锁的标识是否设置成1,锁标志位是否为01。如果没有偏向锁,则将其标记为偏向状态(1 01),同时使用 CAS 操作将线程 ID 记录到 Mark Word 中,接着可执行同步代码。
(2)如果为可偏向状态,则测试线程ID是否指向当前线程,如果是则执行同步代码,否则通过CAS操作竞争锁。
(3)如果竞争成功,则将Mark Word中线程ID设置为当前线程ID,然后执行同步代码,否则表示有竞争,将偏向锁升级为轻量级锁。
轻量级锁并不是用来代替重量级锁的,它的本意是在没有多线程竞争的前提下,减少传统的重量级锁使用产生的性能消耗。在解释轻量级锁的执行过程之前,先明白一点,轻量级锁所适应的场景是线程交替执行同步块的情况,如果存在同一时间访问同一锁的情况,就会导致轻量级锁膨胀为重量级锁。
轻量级锁升级过程:
当线程获得轻量级锁时,首先会将对象头的markword字段复制到本线程的栈帧的锁记录空间中,并利用cas操作将原markword改为锁记录空间的指针,当线程2通过cas操作失败时,则先自旋一段时间。若通过多次自旋依然失败,则锁升级为重量级锁。