当前位置:网站首页>Synchronized理论
Synchronized理论
2022-07-26 18:05:00 【virtuousOne】
Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。
- 原子性:确保线程互斥的访问同步代码
- 可见性:保证共享变量的修改能够及时可见
- 有序性:有效解决重排序问题

偏向锁:
- 当jvm开启偏向锁模式(默认),新创建的obj它的markword表示匿名偏向,处于这种状态的偏向锁,可以被任何线程竞争。竞争者使用CAS的方式将锁对象markword的高54bit设置为当前线程ID,成功则表示拿到了锁,否则就走锁升级逻辑。
- 偏向锁退出锁时,并不会将markword再修改为"匿名偏向"状态.这样的好处是下一次偏向锁再次获取这把锁时,仅仅对比当前线程id是不是markword的偏向锁线程即可了。
- 当偏向锁不是偏向当前线程状态的时候,或者CAS竞争失败,当前线程需要撤销偏向锁,将偏向锁升级。撤销偏向锁的时候,是在提交安全点执行偏向锁撤销任务。
撤销偏向锁为什么需要在安全点执行?
线程获取锁的第一步就是向线程栈的锁记录空间中push一条锁记录信息。并且每次重入,都会插入一条心的锁记录,用于表示重入次数。
锁记录空间原则上只允许本线程操作,所以一定是线程安全的。当偏向锁线程依然持有偏向锁时,说明偏向锁线程锁记录空间中一定存在该lock的LockRecord记录。偏向锁撤销,就需要将偏向锁升级为“轻量级锁”。
轻量级锁:
- 轻量级锁仍然无法提供线程互斥。是属于偏向锁和重量级锁中间的一个缓冲层。存在的意义是延迟重量级锁的到来,让重量级锁只有在真正需要线程互斥时再申请。
场景:
A和B两个线程,运行过程中获取了指定Lock,但是A拿锁时B不拿,B拿锁时A不拿,两个线程完美错开。这种情况依旧是不需要重量级锁。
轻量级锁加锁流程:第一步仍然是向线程栈的锁空间push一条LockRecord。Lock在被抢占之前,markword处于无锁状态,获取锁线程使用CAS替换Lock的markword,成功说明拿到了轻量级锁,失败说明被其他线程正在抢占,或者是当前线程是锁重入
CAS成功,说明本线程是第一次拿到该lock的轻量级锁,需要将插入的LockRecord的displacedMarkWord设置为无锁状态的markword值。
重量级锁
- 在jvm中由objectMonitor实现。默认情况下(开启偏向锁,轻量级支持),只有真正需要互斥时,才会将lock对象膨胀为重量级锁。
场景: 线程A持有锁,且一直未释放。线程B也去申请这把锁,因为A未释放,导致B需要等待A释放。偏向锁和轻量级锁都无法实现让B等待的功能,此时重量级锁就使用。
重量级锁膨胀流程:
假设当前锁处于"偏向锁状态"且偏向A,并且A处于持有状态。B线程去获取锁失败,首先提交偏向锁撤销的任务交给VM线程完成,VM线程会在安全点将偏向A的锁升级为“轻量级锁”且持锁线程为A。VM线程执行完“撤销任务”后,B线程继续运行。尝试抢“轻量级锁”,假设A还没有释放,依然会失败,至此,B推测出线程确实占用。B线程接下来会做锁膨胀逻辑,无限自旋,只有膨胀完成后才会退出,退出时返回锁对象的ObjectMonitor实列。
自旋的逻辑:
- CAS修改锁对象markword为"膨胀中即0值"
- 如果成功,当前线程将负责膨胀逻辑,否则当前线程自旋等待其他线程完成膨胀。再返回其他线程为lock申请的objectMonitor。
- 负责膨胀的线程,到ObjectMonitorPool中申请一个空闲的ObjectMonitor实列,初始化好ObjectMonitor实列的字段。
边栏推荐
- 5款WPS Office最佳海外替代品
- 【考研词汇训练营】Day 13 —— reliance,expert,subject,unconscious,photograph,exaggeration,counteract
- Comparison of advantages and disadvantages between SD NAND and EMMC
- 中信建投启牛会员优惠开户安全吗,不知道是不是最低的佣金
- 2022 chemical automation control instrument test question simulation test platform operation
- Brand new! Uncover the promotion route of Ali P5 Engineer ~p8 architect
- MySQL日志介绍
- Interview summary of some large factories
- Use notes of Lichuang EDA
- Is it safe to apply for public REITs account by mobile phone?
猜你喜欢

2022茶艺师(中级)考试题模拟考试题库及答案

FTP协议

一文详解MES系统给企业带来的5大好处,附应用场景

Interview summary of some large factories

2022 chemical automation control instrument test question simulation test platform operation

分布式事务-seata

MySQL - 多表查询与案例详解

Redis learning notes-2. Use of the client

I'm cool, so I'm here

2022年化工自动化控制仪表考题模拟考试平台操作
随机推荐
Huawei cloud · cloud sharing experts~
Simulated 100 questions and simulated examination of refrigeration and air conditioning equipment operation examination in 2022
Likeshop takeout order system is open source, 100% open source, no encryption
2022 Shanghai safety officer C certificate operation certificate examination question bank simulated examination platform operation
LeetCode简单题之第一个出现两次的字母
2022T电梯修理考试题及在线模拟考试
Paged query design of scenarios
Operations research 69 | explanation of classic examples of dynamic planning
2022年制冷与空调设备运行操作考试模拟100题及模拟考试
Sentinel isolation and degradation
篇7:exited on DESKTOP-DFF5KIK with error code -1073741511.
Tensor RT's int8 quantization principle
JS map usage
The United States, Japan and South Korea jointly developed 6G with the intention of anti surpassing, but China has long been prepared
Database expansion can also be so smooth, MySQL 100 billion level data production environment expansion practice
一些时序建模策略(一)
详细介绍@GetMapping和@PostMapping的区别
SSM integration - functional module and interface testing
.Net CLR GC 动态加载短暂堆阈值的计算及阈值超量的计算
2022上海市安全员C证操作证考试题库模拟考试平台操作