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

关于synchronized介绍

synchronized的特性

1. 乐观锁/悲观锁自适应,开始时是乐观锁,如果锁冲突频繁,就转换为悲观锁

2.轻量级/重量级锁自适应 开始是轻量级锁实现,如果锁被持有的时间较长,就转换成重量级锁

3.自旋/挂起等待锁自适应

4.不是读写锁

5.非公平锁

6,可重入锁

synchronized的使用

1)直接修饰普通方法
锁的是对象(单个对象内部加锁):

public class SynchronizedDemo {public synchronized void methond() {}
}

(2)修饰静态方法
锁的是类的所有对象:

public class SynchronizedDemo {public synchronized static void method() {}
}


(3)修饰代码块
明确指定锁哪个对象:
锁当前对象:

public class SynchronizedDemo {public void method() {synchronized (this) {}}
}

锁类对象:

public class SynchronizedDemo {public void method() {synchronized (SynchronizedDemo.class) {}}
}

只有两个线程竞争同一把锁,才会有锁冲突,才会产生阻塞等待。

synchronized的锁机制

1.锁升级

JVM将synchronized锁分为⽆锁、偏向锁、轻量级锁、重量级锁状态。会根据情况,进⾏依次升
级。

1.偏向锁阶段

核心思想:懒汉模式,能不加锁就不加锁,能晚加锁则晚加锁

偏向锁:并非真正加锁了,而是做了非常轻量的标记

一旦其他线程来和我竞争这个锁,就在另一个线程之前,先把锁获取到

从偏向锁升级到轻量级锁(真正加锁,有互斥)

没有竞争,就把加锁省略

非必要不加锁

在遇到竞争的情况下,偏向锁没有提升效率,但是如果在没有竞争的情况下,偏向锁就大幅度提升效率

2.轻量级锁阶段

有竞争但不多   通过自旋锁方式实现

优:另外的线程把锁释放了,就会第一时间拿到锁

劣:比较耗CPU

与此同时,synchronized内部也会统计 当前这着锁对象,有多少个线程在参与竞争,这里当发生参与竞争的线程比较多了,就会进一步升级到重量级锁

对于自旋锁来说,如果同一个锁竞争者很多,大量的线程都在自旋,整体CPU的消耗就很大

 3.重量级锁阶段

此时拿不到锁的线程就不会继续自旋了,而是进行"阻塞等待",就会让出CPU了(不会使CPU占用率太高)

当当前线程释放锁的时候,就由系统随机唤醒一个线程随机唤醒一个线程来获取锁

2.锁消除

也是synchronized 中内置的优化策略

编译器优化中的一种方式,编译器编译代码的时候,如果发现这个代码,不需要加锁,就会自动化把锁干掉

锁消除,针对一眼看上去就完全不涉及线程安全问题的代码,能够把锁消除掉

偏向锁,运行起来才知道有没有锁冲突

 3.锁粗化

会把多个细粒度的锁,合并成一个粗粒度的锁

synchronized{} 大括号里包含的代码越少,就认为锁的粒度越细,包含的代码越多,就认为锁的粒度越粗

通常情况下,是更偏好于让锁的粒度细一点,更有利于多个线程并发执行的.但是有的时候,是希望锁的粒度粗点也挺好

 总结:

1.锁升级:偏向锁-> 轻量级锁->重量级锁

2.锁消除:自动干掉不必要的锁

3.锁粗话:把多个细粒度的锁合并成一个粗粒度的锁,减少锁竞争的开销

相关文章:

关于synchronized介绍

synchronized的特性 1. 乐观锁/悲观锁自适应,开始时是乐观锁,如果锁冲突频繁,就转换为悲观锁 2.轻量级/重量级锁自适应 开始是轻量级锁实现,如果锁被持有的时间较长,就转换成重量级锁 3.自旋/挂起等待锁自适应 4.不是读写锁 5.非公平锁 6,可重入锁 synchronized的使用 1&#…...

NCDA设计大赛获奖作品剖析:UI设计如何脱颖而出?

第十二届大赛简介 - 未来设计师全国高校数字艺术设计大赛(NCDA)开始啦!视觉传达设计命题之一: ui 设计,你想知道的都在这里。为了让大家更好的参加这次比赛,本文特别为大家整理了以往NCDA大赛 UI 设计的优秀获奖作品&a…...

软考中级 软件设计师备考经验

考试介绍 软考中级的软件设计师需要考两个部分,选择题和大题,每科满分75,需要在同一次考试中两科同时大于等于45分才算通过。考试的内容包括计算机组成原理、数据结构、数据库、专业英语、信息安全、计算机网络等,范围比较广但考…...

Python猜数字小游戏

下面这段代码是一个简单的数字猜测游戏,其中计算机已经提前计算出了414 // 23的结果并存储在变量num中。然后,程序会提示用户来猜测这个结果。 以下是代码的主要步骤和功能: 初始化: num 414 // 23:计算414除以23的整…...

SQL面试题(2)

第一题 创建trade_orders表: create table `trade_orders`( `trade_id` varchar(255) NULL DEFAULT NULL, `uers_id` varchar(255), `trade_fee` int(20), `product_id` varchar(255), `time` varchar(255) )ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_…...

python常用pandas函数nlargest 和 nsmallest及其手动实现

pandas是Python数据分析的重要工具之一,提供了大量便捷的数据操作方法。nlargest和nsmallest是pandas中两个非常实用的函数,它们可以帮助我们快速找出Series或DataFrame中最大或最小的n个值。 ### pandas中的nlargest和nsmallest函数 - nlargest(n, colu…...

第六课:NIO简介

一、传统BIO的缺点 BIO属于同步阻塞行IO,在服务器的实现模型为,每一个连接都要对应一个线程。当客户端有连接请求的时候,服务器端需要启动一个新的线程与之对应处理,这个模型有很多缺陷。当客户端不做出进一步IO请求的时候,服务器…...

在vue2中使用饼状图

1.引入vue2和echarts <script src"https://cdn.jsdelivr.net/npm/vue2.7.14/dist/vue.js"></script> <script src"https://cdn.jsdelivr.net/npm/echarts5.4.0/dist/echarts.min.js"></script> 2.1 补充基本的body内容 <div id…...

面经(五)南京 软通动力 一面

注&#xff1a;已经有了接近一年的工作经验 总体评价 不完全是技术面&#xff0c;面试经过还行&#xff0c;但可能是期望岗位和对方需求不太一致&#xff0c;感觉不太好过 面试经过 HR找你&#xff0c;发简历入库&#xff0c;然后商量面试时间&#xff0c;发腾讯会议链接腾…...

线段树模型及例题整理

线段树的应用范围非常广&#xff0c;可以处理很多与区间有关的题目。 将区间抽象成一个节点&#xff0c;在这个节点中储存这个区间的一些值&#xff0c;那么如果看成节点的话&#xff0c;这就很像一棵满二叉树&#xff0c;所以我们可以用一维数组来储存节点。那么就要考虑父子节…...

揭秘Java性能调优的层次 | 综合多方向提升应用程序性能与系统高可用的关键(架构层次规划)

揭秘性能调优的层次 | 综合多方向提升应用程序性能与系统的高可用 前言介绍调优层次调优 — 设计案例说明 - 操作轮询控制事件驱动 调优 — 代码案例说明 - ArrayList和LinkedList性能对比案例说明 - 文件读写实现方式的性能对比 调优 — JVMJVM架构分布JVM调优方向**JVM垃圾回…...

事件循环解析

浏览器的进程模型 何为进程&#xff1f; 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 何为线程&#xff1f; 有了进程后&…...

物联网技术助力智慧城市安全建设:构建全方位、智能化的安全防护体系

一、引言 随着城市化进程的加速和信息技术的迅猛发展&#xff0c;智慧城市已成为现代城市发展的重要方向。在智慧城市建设中&#xff0c;安全是不可或缺的一环。物联网技术的快速发展为智慧城市安全建设提供了有力支持&#xff0c;通过构建全方位、智能化的安全防护体系&#…...

mac打不开xxx软件, 因为apple 无法检查其是否包含恶意

1. 安全性与隐私下面的允许来源列表&#xff0c;有些版本中的‘任何来源’选项被隐藏了&#xff0c;有些从浏览器下载的软件需要勾选这个选项才能安装 打开‘任何来源’选项 sudo spctl --master-disable 关闭‘任何来源’选项 sudo spctl --master-enable...

《深入浅出红黑树:一起动手实现自平衡的二叉搜索树》

一、分析 1. 红黑树的性质 红黑树是一种自平衡的二叉搜索树&#xff0c;它具有以下五个性质&#xff1a; &#xff08;1&#xff09;节点是红色或黑色。 &#xff08;2&#xff09;根节点是黑色。 &#xff08;3&#xff09;所有叶子节点&#xff08;NIL节点&#xff09;是…...

C++——模版

前言&#xff1a;哈喽小伙伴们好久不见&#xff0c;这是2024年的第一篇博文&#xff0c;我们将继续C的学习&#xff0c;今天这篇文章&#xff0c;我们来习一下——模版。 目录 一.什么是模版 二.模版分类 1.函数模版 2.类模板 总结 一.什么是模版 说起模版&#xff0c;我们…...

《TCP/IP详解 卷一》第9章 广播和组播

目录 9.1 引言 9.2 广播 9.2.1 使用广播地址 9.2.2 发送广播数据报 9.3 组播 9.3.1 将组播IP地址转换为组播MAC地址 9.3.2 例子 9.3.3 发送组播数据报 9.3.4 接收组播数据报 9.3.5 主机地址过滤 9.4 IGMP协议和MLD协议 9.4.1 组成员的IGMP和MLD处理 9.4.2 组播路由…...

备战蓝桥杯---动态规划的一些思想1

话不多说&#xff0c;直接看题&#xff1a; 目录 1.双线程DP 2.正难则反多组DP 3.换个方向思考&#xff1a; 1.双线程DP 可能有人会说直接贪心&#xff1a;先选第1条的最优路径&#xff0c;再选第2条最优路径。 其实我们再选第1条时&#xff0c;我们怎么选会对第2条的路径…...

基于BERTopic模型的中文文本主题聚类及可视化

文章目录 BERTopic简介模型加载地址文本加载数据处理BERTopic模型构建模型结果展示主题可视化总结BERTopic简介 BERTopic论文地址:BERTopic: Neural topic modeling with a class-based TF-IDF procedure BERTopic是一种结合了预训练模型BERT和主题建模的强大工具。它允许我…...

MySQL:函数

提醒&#xff1a; 设定下面的语句是在数据库名为 db_book里执行的。 创建user_info表 注意&#xff1a;pwd为密码字段&#xff0c;这里使用了VARCHAR(128)类型&#xff0c;为了后面方便对比&#xff0c;开发项目里一般使用char(32)&#xff0c;SQL语句里使用MD5加密函数 USE db…...

从TwinCAT配置到Simulink-Realtime:打通松下伺服EtherCAT实时控制的实践指南

1. 为什么需要打通TwinCAT和Simulink-Realtime 在工业自动化领域&#xff0c;EtherCAT因其出色的实时性能和灵活的拓扑结构&#xff0c;已经成为伺服控制的首选通信协议。而将TwinCAT与Simulink-Realtime结合使用&#xff0c;可以充分发挥两者的优势&#xff1a;TwinCAT提供专业…...

RexUniNLU开源NLU模型实战:金融研报关系抽取+事件时间线自动生成案例

RexUniNLU开源NLU模型实战&#xff1a;金融研报关系抽取事件时间线自动生成案例 1. 引言&#xff1a;当研报分析遇上智能信息抽取 想象一下这个场景&#xff1a;作为一名金融分析师&#xff0c;你刚收到一份长达50页的行业深度研究报告。你需要从中找出所有提到的公司、它们之…...

告别网络依赖!手把手教你本地部署Element UI v2.15.13离线文档(附Nginx/VSCode两种方法)

告别网络依赖&#xff01;手把手教你本地部署Element UI v2.15.13离线文档&#xff08;附Nginx/VSCode两种方法&#xff09; 作为一名长期在咖啡厅、地铁等弱网环境下工作的前端开发者&#xff0c;我深刻体会到离线文档的重要性。Element UI作为Vue.js生态中最受欢迎的UI框架之…...

FaceFusion使用技巧:教你如何实现跨设备访问换脸工具

FaceFusion使用技巧&#xff1a;教你如何实现跨设备访问换脸工具 1. FaceFusion简介 FaceFusion是新一代AI换脸工具&#xff0c;无需复杂安装即可一键运行。它支持Nvidia和AMD全系列显卡&#xff0c;能够实现高清换脸、去遮挡、卡通脸替换等功能。最新版本增加了三种遮罩功能…...

模型预测控制:从数学到车轮的暴力破解

mpc模型预测控制从原理到代码实现 mpc模型预测控制详细原理推导 matlab和c两种编程实现 四个实际控制工程案例&#xff1a; 双积分控制系统 倒立摆控制系统 车辆运动学跟踪控制系统 车辆动力学跟踪控制系统 包含上述所有的文档和代码。 模型预测控制&#xff08;MPC&#xff09…...

【ollama】模型选择指南:从性能到应用场景的全面解析

1. 为什么需要关注ollama模型选择&#xff1f; 第一次接触ollama时&#xff0c;我像发现新大陆一样兴奋——这个开源框架能让各种大语言模型在本地跑起来。但很快就被现实打脸&#xff1a;随便下载个模型&#xff0c;电脑风扇就开始狂转&#xff0c;响应速度慢得像老牛拉车。这…...

OpenCV实战:SimpleBlobDetector参数调优全攻略(附完整代码)

OpenCV实战&#xff1a;SimpleBlobDetector参数调优全攻略&#xff08;附完整代码&#xff09; 在工业视觉检测和医学图像分析领域&#xff0c;斑点检测是一项基础但至关重要的任务。想象一下这样的场景&#xff1a;生产线上的零件表面缺陷检测、显微镜下的细胞计数、PCB板焊点…...

SMUDebugTool终极指南:7个维度深度解析AMD Ryzen系统硬件调试

SMUDebugTool终极指南&#xff1a;7个维度深度解析AMD Ryzen系统硬件调试 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: htt…...

AAAI 2026 大模型安全相关论文整理

AAAI 2026 大模型安全相关论文整理 总目录 大模型安全研究论文整理 2026年版&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/159047894 https://claude.ai/chat/916dfe36-9753-4199-baa2-44fc2f709fb6 统计&#xff1a;共收集 27 篇论文&#xff0c;来自 AAAI …...

SO-ARM100机械臂Feetech舵机控制SDK独立封装实战

1. 为什么需要独立封装Feetech舵机控制SDK 当你第一次拿到SO-ARM100机械臂时&#xff0c;可能会直接使用LeRobot框架进行控制。这个框架确实提供了完整的解决方案&#xff0c;但就像带着整个工具箱去拧一颗螺丝——过度依赖框架会导致几个实际问题&#xff1a; 依赖臃肿&#x…...