当前位置: 首页 > news >正文

Java并发 | 18.[锁机制] 轻量级锁(CAS+自旋锁)

文章目录

  • 1. 轻量级锁分析
    • 回顾重量级锁
    • 轻量级锁的优势
  • 2. CAS(Compare And Swap)
  • 3. 轻量级锁(CAS+自旋锁)
    • 3.1. 整体流程图
    • 3.2. 加锁、锁重入、锁释放(CAS)
    • 3.3. 锁膨胀(CAS+自旋)
  • 参考资料

1. 轻量级锁分析

回顾重量级锁

在上文 Java并发 | 17.[锁机制] 重量级锁(Monitor+自旋锁)中对重量级锁进行过解析,需要实现重量级锁,就要向操作系统申请一个 Monitor 对象。

轻量级锁的优势

轻量级锁使用CAS和自旋锁来获取锁,避免了向操作系统申请 Monitor 对象,从而减少性能消耗。

2. CAS(Compare And Swap)

顾名思义,在进行比较后如果满足条件,就会交换内容。

在轻量级锁机制中,则是判断 obj 中 Mark Word 是否为 "指向LockRecord"的指针,若不是,则将当前线程中 “LockRecord 里指向自己的指针” 与 MarkWord 交换。

CAS概述

3. 轻量级锁(CAS+自旋锁)

3.1. 整体流程图

轻量级锁流程图

3.2. 加锁、锁重入、锁释放(CAS)

  • [加锁] 线程t1发现 obj 的 MarkWord 不是「指向LockRecord的指针」,于是 将指向LockRecord的指针与MarkWord 进行交换(CAS);
  • [锁重入] 当一段 synchronized( obj1 ) 代码块中递归地执行了 synchronized( obj1 ) 代码块,就会出现「锁重入」,此时虽然CAS失败,但线程t1发现指针指向的 LockRecord 是属于自己的,于是创建一个新的 LockRecord 用于计数;
  • [锁释放]synchronized( obj ) 代码块执行完毕,则 将MarkWord与指向LockRecord的指针 换回原来的位置(再次CAS)。

轻量级锁

3.3. 锁膨胀(CAS+自旋)

若发生了锁竞争(线程t2尝试CAS失败,并发现对象头中指针指向的LockRecord并不属于自己),那线程t2就会循环 争抢锁直到超出次数上限(默认10次,JVM底层会自适应调整),就会将锁升级为「重量级锁」。

  • [申请Monitor] 向操作系统申请一个 Monitor 对象;
  • [重置指针、进入EntryList] obj 中的指针被替换成「指向Monitor的指针」,Monitor 中的 Owner 指向 t1,t2 进入 EntryList 并进入 BLOCKED 状态;
  • [唤醒t2] t1 执行完毕后,尝试 CAS 失败,说明锁已进行过升级,于是根据JVM底层算法,唤醒 EntryList 中的某个线程,并使之成为「重量级锁」的新 Owner。

锁膨胀

参考资料

[视频] 04.030-synchronized优化原理-轻量级锁

[文章] 从偏向锁是如何升级到重量级锁的-轻量级锁

相关文章:

  • 【Pytorch】torch.nn.Dropout()
  • 组件通信的方法
  • 【Pytorch】torch. matmul()
  • 【JVM笔记】类型转换字节码指令
  • 聚观早报 | 东方甄选与顺丰、京东合作;拼多多跨境电商平台上线
  • 如何创建并运行java线程呢?
  • dubbo安装跟部署
  • ESP8266-Arduino编程实例-QRE1113红外反射传感器
  • 【Django】REST_Framework框架——Mixin类和GenericAPIView中的视图子类源码解析
  • Springboot、Tomcat启动加载外部指定文件夹下的jar文件
  • MySQL教程 - 索引(Index)
  • 神经网络做预测的原理,神经网络预测空气质量
  • java代码审计的点
  • alsa-lib和alsa-utils移植
  • SAP 电商云 Spartacus 服务器端渲染的单步调试详细步骤
  • C++11: atomic 头文件
  • eclipse(luna)创建web工程
  • go语言学习初探(一)
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • java2019面试题北京
  • Java的Interrupt与线程中断
  • jquery cookie
  • JWT究竟是什么呢?
  • k个最大的数及变种小结
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • MySQL用户中的%到底包不包括localhost?
  • 计算机在识别图像时“看到”了什么?
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 让你的分享飞起来——极光推出社会化分享组件
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 提醒我喝水chrome插件开发指南
  • 一文看透浏览器架构
  • 用简单代码看卷积组块发展
  • 函数计算新功能-----支持C#函数
  • $jQuery 重写Alert样式方法
  • (11)MATLAB PCA+SVM 人脸识别
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .Net程序帮助文档制作
  • .net程序集学习心得
  • .NET框架
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [HeMIM]Cl,[AeMIM]Br,[CeEIM]Cl,([HO-PECH-MIM]Cl,[HOOC-PECH-MIM]Cl改性酚醛树脂
  • [Neural Network] {Université de Sherbrooke} L2.9 Param Initialization
  • [one_demo_9]判断数组是否递增
  • [ruby on rails] array、jsonb字段
  • [World Wind学习]22.相机高度和瓦片等级计算
  • [编程技巧] 巧用CPU缓存优化代码:数组 vs. 链表