目录
一、乐观锁与悲观锁
二、读写锁与互斥锁
三、轻量级锁与重量级锁
四、自旋锁与挂起等待锁
五、公平锁与非公平锁
六、synchronized锁策略
1、锁升级
2、锁消除
3、锁粗化
一、乐观锁与悲观锁
乐观锁与悲观锁描述了两种不同的加锁态度,乐观锁就预测锁冲突的概率低所以做的处理比较简单,悲观锁就是预测锁冲突的概率比较高所以做的处理比较复杂
二、读写锁与互斥锁
synchronized就是普通的互斥锁,当有两个线程竞争同一把锁时一个线程获取到了锁另一个线程就会等待,而读写锁就分几种情况:读锁和读锁之间不会产生竞争,写锁与写锁之间会产生竞争,写锁与读锁之间也会产生竞争,读写锁相比普通锁少了许多锁竞争优化了效率
三、轻量级锁与重量级锁
轻量级锁指的是加锁的开销比较小一般不涉及从用户态到内核态的切换,如接下来的自旋锁,重量级锁指的是加锁开销比较大一般涉及从用户态到内核态的切换,如下面的挂起等待锁
四、自旋锁与挂起等待锁
自旋锁是一种轻量级锁的实现,挂起等待锁是重量级锁的实现,自旋锁他会一直重复的询问当前锁是否释放,他会在第一时间获取到锁
五、公平锁与非公平锁
公平锁就是多个线程按照一定是顺序持有锁,非公平锁则是抢占式获取锁可能会出现后到先得情况
六、synchronized锁策略
1、锁升级
synchronized既是乐观锁也是悲观锁,既是轻量级锁也是重量级锁,乐观锁部分基于自旋锁实现悲观锁部分基于挂起等待锁实现,他是普通的互斥锁,是非公平锁也是可重入锁。synchronized是自适应锁,初始使用的时候,如果没有发生锁竞争,此时他并没有真正的加锁而是处于偏向锁的状态如果一直没有锁竞争就会处于偏向锁状态直到结束,偏向锁节约了加锁解锁的开销,如果在开始一段时间后发生了锁竞争且并不激烈,则是以基于自旋锁实现的轻量级锁来工作,如果后续锁竞争变得激烈了,则会以基于挂起等待锁实现得重量级锁来工作
2、锁消除
如果JVM判断发现此处不需要加锁而你加了synchronized,JVM就会将这个锁消除掉,或者你加了synchronized但是多个线程之间并不涉及变量得修改,JVM也会将这个锁进行消除,当然这与内存可见性不同的是这必须是JVM在100%确定得情况下
3、锁粗化
锁粗化类似下面的场景会发送锁粗化来提高效率