当前位置:网站首页>synchronized已经不在臃肿了,放下对他的成见之初识轻量级锁
synchronized已经不在臃肿了,放下对他的成见之初识轻量级锁
2022-08-02 15:39:00 【51CTO】
前言
- 物竞天择,适者生存。JDK也在不断的优化中。关于JDK中synchronized锁内部也是不断的优化,前面我们分析了偏向锁用来解决初期问题,随着争抢的不断堆积轻量级锁营运而生。
- 关注我,一个不断进步的社畜码农,带你一起摆脱危机
轻量级锁
- 上面说了没有竞争情况并且开启偏向锁的同时,才会产生偏向锁。但是偏向锁是不会主动撤销的。我们看下下面案列
- vm配置如下
-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0
- 我们能够看到上锁前,上锁中,上锁后三个过程test对象中的markword一直都是偏向锁。这说明不会主动撤销
- 基于这个前提下,我们试想下有两个线程不同时间针对同一个对象上锁,这叫不叫资源竞争?因为不在同一时间运行期间实际上是交互进行的,但是因为偏向锁默认条件下是不会主动释放的。在偏向锁上锁流程是通过CAS将当前线程写入markword的,在写入之前是会进行对比锁对象markword是否是当前线程的。如果是和当前线程id一致的话,只会在计数器上加1 ,用于实现可重入式锁。
- 如果是第二个线程不管是不是同时都会发生线程id不一致情况。这个时候就会发生偏向锁升级成轻量级锁。这个升级的过程也是很麻烦的过程。JVM实际上需要找到安全点(即线程不活动时间点)先撤销偏向锁,然后在上轻量级锁
偏向锁图示
轻量级锁图示
- 通过图示我们也能够看的出来,偏向锁只会发生一次CAS, 而轻量级锁会无时无刻不发生CAS , 我们要知道CAS引发的线程自旋也是耗费CPU调度的,因为线程都处于活跃状态,那么CPU就会发生线程调度切换。所以在并发不是很高和普遍的项目中偏向锁是很搞笑的。
- 上述代码我们能够看出,在t2线程中尝试加锁就会变成轻量级锁。轻量级锁和偏向锁不同的是,轻量级锁使用后会释放锁,变成无锁状态
- 当锁是偏向锁的时候,被另外的线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,从而提高性能。
- 在代码进入同步块的时候,如果同步对象锁状态为无锁状态(锁标志位为“01”状态,是否为偏向锁为“0”),虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间,用于存储锁对象目前的Mark Word的拷贝,然后拷贝对象头中的Mark Word复制到锁记录中。
- 拷贝成功后,虚拟机将使用CAS操作尝试将对象的Mark Word更新为指向Lock Record的指针,并将Lock Record里的owner指针指向对象的Mark Word。
- 如果这个更新动作成功了,那么这个线程就拥有了该对象的锁,并且对象Mark Word的锁标志位设置为“00”,表示此对象处于轻量级锁定状态。
- 如果轻量级锁的更新操作失败了,虚拟机首先会检查对象的Mark Word是否指向当前线程的栈帧,如果是就说明当前线程已经拥有了这个对象的锁,那就可以直接进入同步块继续执行,否则说明多个线程竞争锁。
- 若当前只有一个等待线程,则该线程通过自旋进行等待。但是当自旋超过一定的次数,或者一个线程在持有锁,一个在自旋,又有第三个来访时,轻量级锁升级为重量级锁。
- 多个线程在不同的时间段请求同一把锁,也就是说没有锁竞争。针对这种情形,Java 虚拟机采用了轻量级锁,来避免重量级锁的阻塞以及唤醒
- 轻量级锁的条件是发生竞争或者是不得不上轻量级锁。下面我们看一种不得不上轻量级锁的案列 , 注意VM属性开启偏向锁延迟 及VM不做任何配置
- 这段代码和上面偏向锁演示匿名偏向锁的代码是一样的,不同的是VM的配置取消了。也就是开启了偏向锁延迟。那么我们第一次打印的test对象中markword中是无锁状态。按理说第二次就应该上偏向锁了。但是我们试想一下在第二次上偏向锁的时候延迟偏向也有可能会上偏向锁,这不就发生了资源争抢了吗,为了避免和延迟偏向发生冲突,所以第二次直接是轻量级锁。
边栏推荐
- JZ15 二进制中1的个数
- 无线振弦采集仪远程修改参数方式
- CefSharp实战演示
- 微信小程序:Framework inner error FLOW_CREATE_NODE
- 不平衡之钥: 重加权法知几何
- uniapp 小程序 动态style class
- Brute-force cracking of the latest JVM interview questions of Meituan: unlimited execution
- 机械臂速成小指南(十四):多项式插值轨迹规划
- 已经2022下半年了,居然还在说链动2+1!
- redis学习四redis消息订阅、pipeline、事务、modules、布隆过滤器、缓存LRU
猜你喜欢
华为研究院19级研究员几年心得,终成趣谈网络协议文档,附大牛讲解
20 Lectures on Disassembly of Multi-merchant Mall System Functions-Platform Distribution Overview
MySQL-1-环境部署
Number 类及各子类所占字节数源码分析
机械臂速成小指南(十七):直线规划
2.4 - 三态模型
TCP(传输控制协议)
CWE4.8: The 25 most damaging software security issues in 2022
Basic management of mysql database in Linux system
【学术相关】北大一研究生偷取同门师妹论文发表,作者却挂名给了武大 3 位不知情的学生......
随机推荐
Qt | 关于样式表的使用 QStyleSheet
CefSharp practical demonstration
智能座舱供应链的“新主角”
VPP snort插件
ROS 之 KUKA iiwa编程
跨境电商看不到另一面:商家刷单、平台封号、黑灰产牟利
VLAN实验
Qt | 文件操作 QFile
不平衡之钥: 重加权法知几何
制胜精细化运营时代 华为应用市场打出内容、场景、商业运营组合拳
助力疫情防控,30行代码就能搞定无服务器实时健康码识别!
tiup mirror modify
我今天终于发现demo才是一切
策略路由下发
【[USACO06NOV]Corn Fields G】【状压DP】
MySQL-3-密码破解
2022 年值得尝试的 7 个 MQTT 客户端工具
再见Attention:建模用户长期兴趣的新范式
防抖节流(后续继续更新)
esp32之arduino配置下载提速