synchronized 优化手段之锁膨胀机制!(3)

简介: synchronized 优化手段之锁膨胀机制!(3)

2.轻量级锁


引入轻量级锁的目的是在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统 Mutex Lock(互斥锁)产生的性能消耗。如果使用 Mutex Lock 每次获取锁和释放锁的操作都会带来用户态和内核态的切换,这样系统的性能开销是很大的。


当关闭偏向锁或者多个线程竞争偏向锁时就会导致偏向锁升级为轻量级锁,轻量级锁的获取和释放都通过 CAS 完成的,其中锁获取可能会通过一定次数的自旋来完成。


注意事项


需要强调一点:轻量级锁并不是用来代替重量级锁的,它的本意是在没有多线程竞争的前提下,减少传统的重量级锁使用产生的性能消耗。轻量级锁所适应的场景是线程交替执行同步块的情况,如果同一时间多个线程同时访问时,就会导致轻量级锁膨胀为重量级锁。


3.重量级锁


synchronized 是依赖监视器 Monitor 实现方法同步或代码块同步的,代码块同步使用的是 monitorenter 和 monitorexit 指令来实现的,monitorenter 指令是在编译后插入到同步代码块的开始位置,而 monitorexit 是插入到方法结束处和异常处的,任何对象都有一个 Monitor 与之关联,当且一个 Monitor 被持有后,它将处于锁定状态。


如以下加锁代码:


publicclass SynchronizedToMonitorExample {
    public static void main(String[] args) {
        int count = 0;
        synchronized (SynchronizedToMonitorExample.class) {
            for (int i = 0; i < 10; i++) {
                count++;
            }
        }
        System.out.println(count);
    }
}


当我们将上述代码编译成字节码之后,它的内容是这样的:


微信图片_20220120205709.jpg


从上述结果可以看出,在 main 方法的执行中多个 monitorenter 和 monitorexit 的指令,由此可知 synchronized 是依赖 Monitor 监视器锁实现的,而监视器锁又是依赖操作系统的互斥锁(Mutex Lock),互斥锁在每次获取和释放锁时,都会带来用户态和内核态的切换,这样就增加了系统的性能开销。

相关文章
|
机器学习/深度学习 安全
一文读懂分类模型评估指标
模型评估是深度学习和机器学习中非常重要的一部分,用于衡量模型的性能和效果。本文将逐步分解混淆矩阵,准确性,精度,召回率和F1分数。
873 1
|
12月前
|
人工智能 自然语言处理 数据可视化
深耕智能文档处理“百宝箱”,合合信息为文档研发注入新动力
在1024程序员节上,合合信息发布了智能文档处理“百宝箱”,包括可视化文档解析工具TextIn ParseX、向量化模型acge-embedding和文档解析测评工具markdown_tester,全面提升文档解析与管理的效率和准确性,广泛应用于知识库构建、智能文档抽取、大模型训练数据治理和文档翻译等多个领域。
|
关系型数据库 MySQL 数据库
(简单成功版本)Mysql配置my.ini文件
(简单成功版本)Mysql配置my.ini文件
2038 0
(简单成功版本)Mysql配置my.ini文件
|
关系型数据库 MySQL Linux
Linux CentOs7 安装Mysql(5.7和8.0版本)密码修改 超详细教程
Linux CentOs7 安装Mysql(5.7和8.0版本)密码修改 超详细教程
957 1
|
SQL Oracle 关系型数据库
MySQL多表查询,SQL,笛卡尔积等值连接自连接外连接,SQL99新特性,完整详细可收藏
MySQL多表查询,SQL,笛卡尔积等值连接自连接外连接,SQL99新特性,完整详细可收藏
MySQL多表查询,SQL,笛卡尔积等值连接自连接外连接,SQL99新特性,完整详细可收藏
|
Web App开发 JavaScript
Chrome浏览器调试js第二次运行出现Uncaught SyntaxError: Identifier ‘***’ has already been declared
Chrome浏览器调试js第二次运行出现Uncaught SyntaxError: Identifier ‘***’ has already been declared
1655 0
Chrome浏览器调试js第二次运行出现Uncaught SyntaxError: Identifier ‘***’ has already been declared
解决办法:error: unknown type name ‘__int64‘
解决办法:error: unknown type name ‘__int64‘
2050 0