Java中锁的概念
-
自旋锁:是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环
-
乐观锁:假定没有冲突,在修改数据时如果发现数据和之前获取的不一致,则读最新数据,修改后重试修改
-
悲观锁:假定会发生并发冲突,同步所有对数据的相关操作,从读数据就开始上锁
-
独享锁(写):给资源加上写锁,线程可以修改资源,其他线程不能再加锁 (单写)
-
共享锁(读):给资源加上读锁后只能读不能改,其他线程也只能加读锁,不能加写锁 (多读)
-
可重入锁、不可重入锁:线程拿到一把锁之后,可以自由进入同一把锁所同步的其他代码,则为可重入锁。
-
公平锁、非公平锁:争抢锁的顺序,如果是按先来后到,则为公平。
几种重要的锁实现方式: synchronized、ReentrantLock、ReentrantReadWriteLock
同步关键字 synchronized
1、用于实例方法、静态方法时,隐式指定锁对象
2、用于代码块时,显示指定锁对象
3、锁的作用域:对象锁、类锁、分布式锁
4、引申:如果是多个进程,怎么办?
- 特性:可重入、独享、悲观锁
-
锁优化:
- 锁消除:(开启锁消除的参数:-XX:+DoEscapeAnalysis -XX:+EliminateLocks)
- 锁粗化:JDK做了锁粗化的优化,但我们自己可从代码层面优化
Note: synchronized关键字,不仅实现同步,JMM中规定,synchronized要保证可见性(不能够被缓存)。
思考

》》》 锁是加在对象头上边的

堆内存中的Java对象

Mark Word

默认情况下JVM锁会经历: 未锁定->偏向锁->轻量级锁->重量级锁 这四个状态
参考来源:
- https://www.cs.princeton.edu/picasso/mats/HotspotOverview.pdf
- https://wiki.openjdk.java.net/display/HotSpot/Synchronization
- 《深入理解Java虚拟机》
轻量级锁

重量级锁

偏向锁

锁的升级过程

tips: 锁没有降级的概念,只能是释放完之后改为未锁定状态
如果觉得有收获就点个赞吧,更多知识,请点击关注查看我的主页信息哦~
网友评论