当前位置:网站首页>偏向锁/轻量锁/重级锁锁锁更健康,上锁解锁到底是怎么完成实现的
偏向锁/轻量锁/重级锁锁锁更健康,上锁解锁到底是怎么完成实现的
2022-08-05 09:20: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
- leetcode 剑指 Offer 10- II. 青蛙跳台阶问题
- 工程制图直线投影练习
- 明天去订票,准备回家咯~~
- Science bosses say | Hong Kong rhubarb KaiBin teacher take you unlock the relationship between the matrix and 6 g
- 15.1.1、md—md的基础语法,快速的写文本备忘录
- 为什么我推荐使用智能化async?
- How ali cloud storage database automatically to speed up the loading speed of www.cxsdkt.cn how to set up the case?
- 19.服务器端会话技术Session
- CVPR 2022 | 将X光图片用于垃圾分割,港中大(深圳)探索大规模智能垃圾分类
猜你喜欢

Pytorch深度学习快速入门教程 -- 土堆教程笔记(三)

CPU的亲缘性affinity

并发之CAS

There is only one switch, how to realize the nqa of master-slave automatic switching

Why do I recommend using smart async?

XCODE12 在使用模拟器(SIMULATOR)时编译错误的解决方法

ECCV 2022 Oral 视频实例分割新SOTA:SeqFormer&IDOL及CVPR 2022 视频实例分割竞赛冠军方案...

科普大佬说 | 港大黄凯斌老师带你解锁黑客帝国与6G的关系

Hundred lines of code launch red hearts, why programmers lose their girlfriends!

开源一夏|OpenHarmony如何查询设备类型(eTS)
随机推荐
XCODE12 在使用模拟器(SIMULATOR)时编译错误的解决方法
Happens-before rules for threads
Does flink cdc support synchronization from oracle dg library?
六年团队Leader实战秘诀|程序员最重要的八种软技能 - 脸皮薄容易耽误事 - 自我营销
2022.8.3
线程之Happens-before规则
Two-table query average grouping in sql server
js 图形操作一(兼容pc、移动端实现 draggable属性 拖放效果)
交换机端口的三种类型详解与hybrid端口实验
工程制图直线投影练习
无题七
Xcode 12 ld: symbol(s) not found for architecture armv64
轩辕实验室丨欧盟EVITA项目预研 第一章(四)
这样写有问题吗?怎么在sql-client 是可以做到数据的同步的
程序员的七种武器
如何实现按键的短按、长按检测?
明天去订票,准备回家咯~~
2022-08-01 回顾基础二叉树以及操作
2022/8/4 考试总结
PAT Grade B-B1020 Mooncake(25)