目录
一、引言
锁在Java中是一个十分重要的内容,所以本篇博客,继续为大家总结一下synchronized的特性,synchronized的使用,synchronized的锁机制。
二、synchronized的基本特点
1.开始时是乐观锁,如果锁冲突频繁,就转换为悲观锁。
2.开始时是轻量级锁,如果锁被长时间持有,就转换成重量级锁。
3.实现轻量级锁的时候大概率用到的自旋锁策略。
4.是一种不公平的锁。
5.是一种可重入的锁。
6.不是读写锁。
此处对各种锁的解释可以观看我的这一篇博客:JavaEE初阶--锁进阶理解-CSDN博客
加锁的工作过程:
JVM将synchronized锁分为无锁,偏向锁,轻量级锁,重量级锁状态。根据情况,依次进行升级。
1.偏向锁
一个尝试加锁的线程,进入偏向锁的状态,即此时的加锁并不是真正的加锁,如果没有其他线程来竞争,那么就不加锁,如果有其他线程竞争,那么就进入轻量级锁的状态。
2.轻量级锁
轻量级锁是通过CAS实现的。CAS的具体介绍,可观看博客:JavaEE初阶--锁进阶理解-CSDN博客
3.重量级锁
如果竞争进一步激烈,自旋不能快速获取锁状态,就会膨胀为重量级锁。会用到内核提供的mutex。
1.执行加锁操作,先进入内核态。
2.在内核态判定当前锁是否已经被占用。
3.如果该锁没有占用,则加锁成功,并切换成用户态。
4.如果该所被占用,则加锁失败,此时线程进入锁的等待队列,挂起,等待被操作系统唤醒。
5.等到这个锁被释放了,操作系统会重新唤醒这个线程,尝试重新获取锁。
三、锁的优化过程
1.锁消除
有的代码用到了synchronized,但并没有在多线程的环境下。(例如StringBuffer)
2.锁粗化
一段逻辑中,如果出现多次加锁的情况,编译器+JVM会自动进行锁的粗化。
四、总结
本篇博客继续总结了一下synchronized锁的用法以及特性。欢迎大家在评论区讨论,感谢大家观看!