当前位置:网站首页>Bias lock/light lock/heavy lock lock is healthier. How is locking and unlocking accomplished?
Bias lock/light lock/heavy lock lock is healthier. How is locking and unlocking accomplished?
2022-08-05 09:29:00 【51CTO】
轻量级锁升级重量级锁
- 只有一个线程抢夺时JVM上偏向锁
- 在出现一个线程时就是轻量级锁.轻量级锁通过CAS进行上锁.失败则会发生自旋
- 当自旋大一定程度或者,此时又出现一个线程上锁,此时会切换成重量级锁.
- 我们能够发现,在出现两个线程进行轻量级锁争抢的时候会切换成重量级锁.
- 都是重量级锁的同时,我发现其他信息是固定的,这个也和我们在内存布局中一样,这里指向的是锁指针,对应的是C++中ObjectMonitor对象指针.重量级指针内部有一个队列就是将没抢上的线程挂起用的.所以这里不会变化.这里注意和线程id进行区分
- 重量级锁用完之后就会释放掉成无锁状态.
锁操作
- 上面我们分别介绍了偏向锁,轻量级锁,重量级锁的定义及场景切换.这里我们稍微总结下三种锁使用场景
- 偏向锁在JVM开启偏向条件下,默认是偏向锁
- 当有另外一个线程再次对对象进行加锁时,不管有没有发生竞争都是轻量级锁.只不过发生竞争时会通过CAS抢占,CAS一定次数还是失败则升级重量级锁.而偏向锁切换到轻量级锁的过程是先撤销偏向锁在上轻量级锁
- 当有两个及以上的时候发生竞争就会切换成重量级锁.切换之前会有一个线程通过自旋等待.默认是10次.这是不固定的,因为有自适应自旋锁的存在
- 除了锁之间的关系,我们还需要掌握下各个锁的原理,上锁解锁的全过程
偏向锁
上锁
- 首先我们检测下状态位是否是
101
.如果是在看下当前markword存储的threadId是否是当前线程.如果是当前线程则可以执行当前代码块 - 如果不是当前线程,则通过CAS写入当前线程;如果写入成功则说明偏向锁上锁成功,继续执行当前代码块
- 如果CAS写入失败,则说明有资源抢占.偏向锁升级成轻量级锁.
总结
-
synchronized
作为被人诟病的一个设计,在JDK1.6之后真的改版了,不要在拿之前的眼光看待他了.毕竟偏向锁和轻量级锁的引入已经将性能提升了很多了. - 偏向锁默认进行,节省调度时间
- 轻量级锁通过CAS完成等待,省调线程挂起,唤醒等操作
- 重量级将线程串行化,保障了线程之间的并发
- 三种状态锁循序渐进给我们适配不同程度的并发需求
边栏推荐
- ts/js function pass parameter with function writing
- Assembly language (8) x86 inline assembly
- 动态内存开辟(C语言)
- 干货!生成模型的评价与诊断
- 无题七
- 轩辕实验室丨欧盟EVITA项目预研 第一章(四)
- 欧盟 | 地平线 2020 ENSEMBLE:D2.13 SOTIF Safety Concept(下)
- express hot-reload
- seata源码解析:TM RM 客户端的初始化过程
- Excuse me, guys, is it impossible to synchronize two databases in real time using Flink SQL CDC?
猜你喜欢
施一公:科学需要想象,想象来自阅读
Example of Noise Calculation for Amplifier OPA855
欧盟 | 地平线 2020 ENSEMBLE:D2.13 SOTIF Safety Concept(上)
21 Days of Deep Learning - Convolutional Neural Networks (CNN): Weather Recognition (Day 5)
【LeetCode】623. 在二叉树中增加一行
5.部署web项目到云服务器
轩辕实验室丨欧盟EVITA项目预研 第一章(四)
js 图形操作一(兼容pc、移动端实现 draggable属性 拖放效果)
Xcode10的打包方式distribute app和启动项目报错以及Xcode 打包本地ipa包安装到手机上
自定义过滤器和拦截器实现ThreadLocal线程封闭
随机推荐
手把手教你纯c实现异常捕获try-catch组件
leetcode 剑指 Offer 10- I. 斐波那契数列
ts/js 函数传参带函数写法
歌词整理
Overall design and implementation of Kubernetes-based microservice project
MySQL使用聚合函数可以不搭配GROUP BY分组吗?
Going to book tickets tomorrow, ready to go home~~
周报2022-8-4
干货!生成模型的评价与诊断
shell脚本实例
19.服务器端会话技术Session
C语言的高级用法
为什么sys_class 里显示的很多表的 RELTABLESPACE 值为 0 ?
leetcode points to Offer 10- I. Fibonacci sequence
express hot-reload
Pytorch深度学习快速入门教程 -- 土堆教程笔记(三)
无题八
线程之Happens-before规则
什么是CRM决策分析管理?
Creo 9.0 基准特征:基准轴