【JUC】17-Synchronized锁升级

news2024/9/20 16:32:13

1. 锁分类

无锁->偏向锁->轻量级锁->重量级锁

 synchronized属于重量级锁,monitor是基于底层os的mutex Lock实现了,挂起线程和恢复线程都需要内核态完成,都需要切换CPU状态来完成。

Monitor与对象以及线程如何关联?
 1.对象被某个线程锁住,则该对象
在这里插入图片描述
在这里插入图片描述

2. synchronized锁升级流程

 synchronized用的锁依赖释放偏向锁标志位和锁标志位。

  • 偏向锁:MarkWord存储的是偏向的线程ID。
  • 轻量锁:MarkWord存储指向线程栈中Lock Recoard的指针。
  • 重量锁:MarkWord存储的是指向堆中的monitor对象的指针。
    在这里插入图片描述

3. 偏向锁

 单线程竞争:当一段同步代码一直被同一个线程多次访问,后续访问自动获取锁。
偏向锁默认有4s的延迟。
 竞争出现才释放偏向锁。
 Java 15取消了偏向锁。
在这里插入图片描述

4. 轻量级锁

 当有另外线程逐步来竞争锁的时候,偏向锁会升级为轻量级锁。
 竞争线程尝试CAS更新对象头失败,会等待到全局安全点 (此时不会执行任何代码) 撤销偏向锁。
在这里插入图片描述
轻量级锁的加锁
 JVM会为每个线程在当前线程的栈帧中创建用于存储记录的空间,即Displaced Mark Word。若一个线程获得锁时,发现是轻量级锁,会把锁的MarkWord复制到Displaced Mark Word里面。然后尝试用CAS将锁的Mark Word替换为指向锁记录的指针。
 成功,当前线程获得锁。失败,表示Mark Word已经被替换成了其他线程的锁记录,说明在与其他线程竞争锁,当前线程就尝试使用自旋来获取锁。
轻量级锁的释放
 在释放锁时,当前线程会使用CAS操作将Displaced Mark Word的内容复制回锁的Mark Word里面。
 没有竞争,那么这个复制的操作会成功。如果其他线程因为自旋多次导致轻量级锁升级为重量级锁,那么CAS操作会失败,此时会释放锁并唤醒被阻塞的线程。

5. 重量级锁

 有大量线程参与锁的竞争,冲突性很高。
 synchronized的重量级锁基于进入和退出Monitor对象实现的。在编译时会将同步块的开始位置插入monitor enter指令,在结束位置插入monitor exit指令。
 当线程执行到monitor enter指令时,会尝试获取对象所对应的Monitor所有权,如果获取到了锁,会在Monitor的owner中存放当前线程的id,这样它将处于锁定状态,除非退出同步块,否则其他线程无法获取到这个Monitor。
 指向互斥量的指针。

6. 锁和哈希码

 不推荐修改hashCode。
 当一个对象计算过hashCode后,再也无法进入偏向锁状态。
 偏向锁过程中遇到一致哈希计算请求,立马撤销偏向模式,膨胀为重量级锁。

  • 无锁状态:对象的hashCode()方法第一次被调用时,JVM会生成对应的identity hash code值并将该值存储到Mark Word中。
  • 偏向锁:线程获取偏向锁,或用线程id和epoch值覆盖identity hash code所在的位置。如果一个对象的hashCode() 方法已被调用过一次之后,这个对象不能被设置偏向锁。为了保证统一对象前后两次调用hashCode() 方法得到的结果一致。
  • 轻量锁:JVM会在当前线程的栈帧中创建一个锁记录(Lock Record)空间,用于存储锁对象的Mark Word拷贝。所以轻量锁可以和identity hash code共存,哈希码和GC年龄保存于此,释放锁后,这些信息写回对象头中,
  • 重量级锁:Mark Word的重量级锁指针指向重量级锁的ObjectMonitor类,里面有字段记录非加锁状态下的Mark Word,释放后也会写回。

7. JIT编译器对锁的优化

 Just in time compiler即时编译器。

7.1 锁消除

 锁消除。JIT编译器会无视它,每次new o,synchronized(o) 就会无视它。

class Test05 {
    Object object = new Object();
    public void print() {
        Object o = new Object();
        synchronized (o) {
            System.out.println("Lock:" + o.hashCode() + " Object:" + object.hashCode());
        }
    }
}
public class demo05 {
    public static void main(String[] args) {
        Test05 test05 = new Test05();
        for(int i=0; i<10; i++) {
            test05.print();
        }
    }
}

7.2 锁粗化

 一次申请锁。

    public static void main(String[] args) {
        Object o = new Object();
        for(int i=0; i<10; i++) {
            synchronized (o) {
                System.out.println("1");
            }
            synchronized (o) {
                System.out.println("1");
            }
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2145629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OV-DINO:统一开放词汇检测与语言感知选择性融合

文章目录 摘要1、引言2、相关工作3、方法3.1、概述3.2、统一数据集成3.3、语言感知选择性融合3.4、以检测为中心的预训练 4、实验4.1、预训练数据和评估指标4.2、实施细节4.3、主要结果4.4、消融研究4.5、定性结果 5 、讨论 摘要 开放词汇检测&#xff08;Open-vocabulary Det…

滑动窗口(6)_找到字符串中所有字母异位词

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 滑动窗口(6)_找到字符串中所有字母异位词 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f4…

《SmartX ELF 虚拟化核心功能集》发布,详解 80+ 功能特性和 6 例金融实践

《SmartX ELF 虚拟化核心功能集》电子书现已发布&#xff01;本书详细介绍了 SmartX ELF 虚拟化及云平台核心功能&#xff0c;包含虚机服务、容器服务、网络服务、存储服务、运维管理、工具服务、数据保护等各个方面。 即刻下载电子书&#xff0c;了解如何利用基于 SmartX ELF …

助力电商升级,智象未来(HiDream.ai)开启未来商业新篇章

近日&#xff0c;智象未来&#xff08;HiDream.ai&#xff09;凭借其创新性的“秩象™大模型”&#xff0c;在业界掀起了一场跨行业的创意革命&#xff0c;对视觉设计、运营商服务、品牌营销以及文旅传媒等领域的创新发展产生了深远影响。致力于全球领先的多模态生成式人工智能…

neo4j节点关联路径的表示、节点的增删改查

目录 核心概念节点的增删改查&#xff08;1&#xff09;增&#xff08;2&#xff09;查&#xff08;3&#xff09;删&#xff08;4&#xff09;改 neo4j文档&#xff1a;https://neo4j.com/docs/ https://neo4j.com/docs/cypher-manual/current/introduction/ 核心概念 节点 ne…

【从计算机的发展角度理解编程语言】C、CPP、Java、Python,是偶然还是应时代的产物?

参考目录 前言什么是"computer"?计算机的大致发展历程计算机系统结构阶段(1946~1981)计算机网络和视窗阶段(1982~2007)复杂信息系统阶段(2008~today)人工智能阶段 越新的语言是越好的吗、越值得学习吗&#xff1f; 前言 最近读了 《Python语言程序设计基础》 这本书…

Linux运维篇-服务器简介

目录 前言服务器分类&#xff08;按服务器的机箱结构来划分&#xff09;台式服务器机架式服务器刀片式服务器 外观部件内部结构前面板前面板组件前面板接口说明前面板指示灯和按钮前面板指示灯/按钮说明 后面板后面板组件后面板接口说明后面板指示灯后面板指示灯说明 主板和 iB…

C#|.net core 基础 - 值传递 vs 引用传递

不知道你在开发过程中有没有遇到过这样的困惑&#xff1a;这个变量怎么值被改&#xff1f;这个值怎么没变&#xff1f; 今天就来和大家分享可能导致这个问题的根本原因值传递 vs 引用传递。 在此之前我们先回顾两组基本概念&#xff1a; 值类型** vs 引用类型** **值类型&a…

适合金融行业的银行级别FTP替代升级方案

在数字化办公日益普及的今天&#xff0c;金融领域对数据传输的需求日益增长&#xff0c;场景也变得更加多样化和复杂。这不仅包括内部协作&#xff0c;还涉及金融服务、外部合作以及跨境数据流动等方面。因此&#xff0c;金融行业对数据传输系统的要求越来越高&#xff0c;传统…

LeetCode 算法笔记-第 04 章 基础算法篇

1.枚举 采用枚举算法解题的一般思路如下&#xff1a; 确定枚举对象、枚举范围和判断条件&#xff0c;并判断条件设立的正确性。一一枚举可能的情况&#xff0c;并验证是否是问题的解。考虑提高枚举算法的效率。 我们可以从下面几个方面考虑提高算法的效率&#xff1a; 抓住…

孙怡带你深度学习(3)--损失函数

文章目录 损失函数一、L1Loss损失函数1. 定义2. 优缺点3. 应用 二、NLLLoss损失函数1. 定义与原理2. 优点与注意3. 应用 三、MSELoss损失函数1. 定义与原理2. 优点与注意3. 应用 四、BCELoss损失函数1. 定义与原理2. 优点与注意3. 应用 五、CrossEntropyLoss损失函数1. 定义与原…

『 Linux 』HTTP(一)

文章目录 域名URLURLEncode和URLDecodeHTTP的请求HTTP的响应请求与响应的获取简单的Web服务器 域名 任何客户端在需要访问一个服务端时都需要一个IP和端口号,而当一个浏览器去访问一个网页时通常更多使用的是域名而不是IP:port的方式, www.baidu.com这是百度的域名; 实际上当浏…

数据结构和算法|排序算法系列(五)|排序总结(时间复杂度和是否稳定)

文章目录 选择排序冒泡排序插入排序快排归并排序堆排序 选择排序 一句话总结&#xff0c;开启一个循环&#xff0c;每轮从未排序区间选择****最小的元素&#xff0c;将其放到已排序区间的末尾。「未排序区间一般也放在后面&#xff0c;已排序区间放在前面」 选择排序 时间复…

2024蓝桥杯省B好题分析

题解来自洛谷&#xff0c;作为学习 目录 宝石组合 数字接龙 爬山 拔河 宝石组合 # [蓝桥杯 2024 省 B] 宝石组合## 题目描述在一个神秘的森林里&#xff0c;住着一个小精灵名叫小蓝。有一天&#xff0c;他偶然发现了一个隐藏在树洞里的宝藏&#xff0c;里面装满了闪烁着美…

Flutter Android Package调用python

操作步骤 一、创建一个Flutter Package 使用以下指令创建一个Flutter Package flutter create --templateplugin --platformsandroid,ios -a java flutter_package_python 二、修改android/build.gradle文件 在buildscript——>dependencies中添加以下内容 //导入Chaqu…

接口幂等性和并发安全的区别?

目录标题 幂等性并发安全总结 接口幂等性和并发安全是两个不同的概念&#xff0c;虽然它们在设计API时都很重要&#xff0c;但侧重点不同。 幂等性 定义&#xff1a;幂等性指的是无论对接口进行多少次相同的操作&#xff0c;结果都是一致的。例如&#xff0c;HTTP的PUT和DELE…

TON基金会与Curve Finance合作:推出基于TON的新型稳定币互换项目

2024年&#xff0c;TON基金会宣布与去中心化金融&#xff08;DeFi&#xff09;领域的知名协议Curve Finance建立战略合作&#xff0c;携手推出一个全新的基于TON区块链的稳定币交换项目。这一合作标志着TON生态系统在DeFi领域的进一步扩展&#xff0c;并将通过Curve Finance的核…

玖逸云黑系统源码 v1.3.0全解无后门 +搭建教程

功能带有卡密生成和添加黑名单等&#xff0c;反正功能也不是很多具体的自己看程序截图即可。 搭建教程 完成 1.我们先添加一个站点 2.PHP选择7.3 3.上传源码解压 4.导入数据库 5.配置数据库信息config.php 源码下载&#xff1a;https://download.csdn.net/download/m0_6…

Python包管理工具pip 入门

主要参考资料&#xff1a; 全面解析 python 包管理工具 pip: https://blog.csdn.net/maiya_yayaya/article/details/135341026 目录 pypi社区pip工具安装 piprequirements.txt 记录python包管理工具8.1 什么是 requirements.txt8.2 requirements.txt 格式8.3 示例8.4 pip 安装 …

鸿蒙手势交互(二:单一手势)

二、单一手势 有六种&#xff1a;点击手势(TapGesture)、长按手势(LongPressGesture)、拖动手势(PanGesture) 捏合手势(PinchGesture)、旋转手势(RotationGesture)、滑动手势(SwipeGesture) 点击手势(TapGesture) TapGesture(value?:{count?:number, fingers?:number}) /…