HostSpot VM内置锁的同步机制简述
HotSpot VM采用采用了三种不同的方式实现了对象监视器object monitor,并且可以在这三种实现方式之间进行自动切换,偏向锁通过在对象头的mark word 的oop(ordinary object pointer)中install一个thread的指针来实现了java对象对该线程的偏向,并且只有该线程能够lock该对象,但是只要是有其他线程企图锁定这个已经被偏向的对象的时候,偏向锁就不在满足这种情况了,这个时候biased locking切换成了Basic locking(基本对象),Basic locking使用CAS操作确保多个java thread在此对象锁上互斥执行,如果CAS由于竞争而失败(第二个线程试图锁定一个正在被其他线程持有的对象),这个基本对象锁因为不在满足而需要从而jvm切换到膨胀锁,objectmonitor,不想偏向锁和基本锁的实现,重量级锁的实现需要在native的heap空间中分配内存,然后指向该空间的内存指针会被装载到java对象中去,这个过程称之为膨胀。
降级的目的和过程
因为Basic locking的实现是优先于重量级锁的使用,JVM会尝试在STW的停顿中对处于“空闲(idle)”状态的重量级锁进行降级(deflate),这个降级的过程是如何实现的呢?我们知道在STW时,所有的java线程都会暂停在“safePoint”,此时VMThread通过所有Monitor的遍历,或者通过对所有依赖于MonitorInUseLists值的当前正在“使用”中的Monitor子序列进行遍历,从而得到哪些未被使用的“Monitor”作为降级对象。
可降级的Monitor对象
重量级锁的降级发生于STW阶段,降级对象及时哪些仅仅能够被VMThread访问而没有其他JavaThread访问的Monitor对象。