为什么引入偏向锁,轻量级锁?介绍下升级流程。
共享锁,排它锁,偏向锁,轻量级锁,重量级锁
间隙锁,林键锁,意向锁,读写锁,乐观锁,悲观锁,表锁,行锁
1.Synchronized 在jdk1.6版本以前,是通过重量锁的方式来实现线程之间锁的竞争,称它为重量级锁,是因为它的底层依赖操作系统的Mutex Lock来实现互斥功能
MuTex是系统方法,应用程序调用系统方法时候,需要切换到内核态来执行,涉及到用户态向内核态的切换,这个切换会带来性能的消耗。
2.Synchronized 在jdk1.6版本中,增加了锁升级的机制,来平衡性能。就是说当线程去访问synchronized同步代码块的时候,synchronzied会根据线程竞争情况,会先尝试在不加重量级锁的情况下,去保证线程安全性,所以引入了偏向锁和轻量级锁的机制。
偏向锁就是直接把当前锁偏向于某个线程,通过CAS修改偏向锁标记。这种锁适合同一个线程多次去申请同一个锁资源并且没有其他线程竞争的场景。
轻量级锁也可以成为自旋锁,通过多次自旋重试去竞争锁。自旋锁优点在于避免用户态到内核态的切换带来的性能开销。
3.Synchronized引入了锁升级的机制以后,如果有线程去竞争锁,首先Synchronized会先用偏向锁的方式去竞争锁资源,竞争到偏向锁,加锁成功直接返回,竞争偏向锁失败,说明锁已经偏向了其他线程;需要将锁升级到轻量级锁,竞争锁的线程会根据自适应自旋次数去抢占锁资源,如果在轻量级锁状态下还是没有竞争到锁;会升级到重量级锁,在重量级锁的状态下,没有竞争到锁的线程就会被阻塞,线程状态是Blocked。