
synchronized 锁升级过程
发布日期:2021-05-14 12:39:14
浏览次数:15
分类:精选文章
本文共 900 字,大约阅读时间需要 3 分钟。
锁升级过程
synchronized在JDK 1.6之前是一个重量级锁,它的使用会直接向操作系统请求锁资源,因此效率较低且占用内存资源较大。在JDK 1.6及以后的版本中,引入了锁升级机制,能够根据实际情况自动调整锁的重量级,以提高效率和资源利用率。这种机制分为偏向锁、轻量级锁和重量级锁的多级升级过程,具体如下:
1. 偏向锁升级到轻量级锁的过程
偏向锁并不是传统意义上的锁资源,而是一种特殊的标记。它作为一个优先级标签,用于表示某个线程优先获得锁。如果一个线程已经获得偏向锁,其他线程在请求锁资源时必须等待。但在多线程环境下,当有其他线程请求锁时,偏向锁会自动升级为轻量级锁,以确保资源的高效利用。在这种情况下:
- 每个线程都需要生成独立的锁记录(LockRecord,简称LR)。
- 线程通过“比较与交换”(CAS)机制来抢占锁记录的指针。
- 如果抢占成功,锁记录的指针会更新为当前线程的标记,这表明该线程已经获得锁;如果失败,线程会在原地自旋等待,直到成功获取锁为止。
这种机制能够在存在竞争的情况下,轻松地将偏向锁升级为轻量级锁。
2. 轻量级锁升级到重量级锁的过程
尽管轻量级锁(自旋锁)的自旋方式能够减少等待时间,但在以下情况下会自动升级为重量级锁:
#####老版本的升级条件
- 自旋次数超过限制:如果线程在尝试获取锁时进行自旋超过10次,JVM会直接将锁升级为重量级锁。\
- 自旋线程数量超过CPU核数的二分之一:当自旋锁的线程数量超过CPU核数的一半时,锁也会直接升级为重量级锁。
#####新版本的升级条件
在新版本的JVM中,采用了自适应自旋(Adaptive CAS)机制。JVM会根据实际性能情况动态调整自旋次数,避免传统自旋锁的资源占用问题。这种机制使得锁升级更加智能和灵活,不需要手动配置参数就能达到最优效果。
总结
通过对上述过程的了解,可以看出锁升级机制在多线程环境下起到了关键作用。在偏向锁阶段,为单线程环境提供了优化;而轻量级锁和重量级锁的升级机制则确保了在多线程、高并发场景下的资源利用率和系统性能。这种多层次的锁升级机制,使得Java的并发编程能力得到了进一步提升。
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月12日 20时49分00秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
How2Heap笔记(三)
2019-03-11
go--microSocket服务端 php客户端
2019-03-11
如何修改Pspice元件库中元件的模型参数?
2019-03-11
51单片机汇编程序——查表
2019-03-11
小程序提交新数据后如何返回上一页并刷新数据?
2019-03-11
qt c++实现的ai贪吃蛇吃满屏幕,超详细!(二)ai的具体实现
2019-03-11
linux 查看log日志相关命令
2019-03-11
IDEA 2019 安装 mybatis-plus插件
2019-03-11
div 实现光标悬停变成手型
2019-03-11
layer.confirm 无效
2019-03-11
Java 回调机制
2019-03-11
7、回归和特征选择
2019-03-11
pycharm使用(新建工程、字体修改、调试)
2019-03-11
什么是Numpy、Numpy教程
2019-03-11
Python学习笔记——元组
2019-03-11
异常声音检测
2019-03-11
PCB学习笔记——AD17如何添加新的封装
2019-03-11
numpy版本问题
2019-03-11