先偏向锁,然后轻量级锁,最后重量级锁,实际jvm对锁的优化顺序是重量级锁->轻量级锁->偏向锁。轻量级锁和偏向锁都是没有竞争条件下的优化情况。

1.从重量级锁优化成轻量级锁

因为重量级锁要给对象关联一个Monitor对象,Monitor对象由操作系统控制,消耗较大,所以产生了轻量级锁,如果多个线程要竞争锁,但是使用锁的事件是错开的,那么可以避免使用Monitor对象,仅仅更改指针即可控制对象锁由哪个线程占有。这是轻量级锁的由来;

在此情况下,轻量级锁进一步优化成自旋锁,当多个线程竞争锁时,不是非要膨胀成重量级锁,而是线程等待锁被释放,当前线程进行自旋状态,类似于空转,这样避免了内核态与用户态的切换(避免了Monitor对象的操作),提高性能。

2.从轻量级锁优化成偏向锁

在轻量级的使用场景下,如果一个线程已经拥有了轻量级锁,但是此线程内部还在synchornized竞争该锁,按照轻量级锁的设置,就会在栈帧中重复执行CAS操作,其实这是没有必要的操作,因为没有线程竞争,只要告诉jvm锁由该线程持有就行,所以产生了偏向锁,告诉jvm当前的对象具体偏向哪一个线程使用。