JavaEE进阶(1)——锁与synchronized

智能问数产品背后的Agent技术揭秘:从任务分解到工具调用的完整流程 本文深入解析智能问数产品背后的Agent技术,从任务分解到工具调用的完整流程。通过大模型驱动的语义理解和动态工具调度,Agent系统能高效处理复杂数据分析需求,显著提升响应速度和准确率。文章详细介绍了模块化架构、任务分解机制、动态工具调用及双通道记忆系统等核心技术,展示了大模型时代的新型数据分析范式。 阅读详情

本文开始深度解析 线程底层的逻辑原理

1.常见锁策略

当我们需要自定义锁(标准库提供的锁 不够用) ——需要关注锁策略

一般情况下 synchronized 足矣覆盖绝大多数使用场景

锁策略 并不是和Java强相关,其他语言凡是涉及到并发编程,涉及到锁,都可以谈这样的锁策略

锁策略 可以简单认为是 ——这个锁在加锁的过程中 有什么特点 什么行为

1.1 悲观锁 乐观锁

描述的是加锁时 遇见的场景

不是针对某一种具体的锁,而是某个具体锁 具有“悲观” 特性或“乐观”特性

  • 悲观:加锁的时候,预测接下来的锁竞争的情况非常激烈,需要针对这样的激烈情况做一些额外的工作
  • 乐观:加锁的时候,锁竞争情况不激烈,不需要做额外工作

例如:

有一把锁 二十个线程尝试获取锁,每个线程加锁的频率都很高,一个线程加锁的时候,很可能锁被一个线程占用——悲观锁

有一把琐 假设只有两个线程线程尝试获取这把锁,每个线程加锁的频率都很低,一个线程加锁的时候,大概率另一个线程没有与其竞争——乐观锁

1.2 重量级锁 轻量级锁

遇到场景之后的解决方案

重量级锁,当悲观的场景下,此时就要付出更多的代价——更低效

轻量级锁,应对乐观的场景,此时付出的代价就会更小——更高效

1.3 挂起等待锁 自旋锁

挂起等待锁——重量级锁的典型实现

=> 操作系统内核级别,加锁的时候发现竞争,就会使该线程进入阻塞状态,后续就需要内核进行唤醒

自旋锁——轻量级锁的典型实现

=>应用程序级别,加锁的时候发现竞争,一般也不是进入阻塞,而是通过忙等的形式进行等待

(乐观锁的场景 本身遇见锁竞争的概率就很小,如果真的遇见竞争,在短时间内就能拿到锁)

例如 追女神 发现女神有对象 选择等待 有两种等待方式

1.等自己眼中的女神(竞争不激烈) =>乐观

等待女神,隔三岔五进行联系,会消耗一定CPU,过不了多久,就能有机会,只要发现机会就能上位,整个锁等待时间不长

即——获取锁的周期更短,及时获取锁,等待过程一直消耗CPU

2.等 公认的女神(竞争激烈)=>悲观

等待过程中不再联系,专心自己的事情,很长时间过去了,偶然听说女神单身的消息(此时女神可能分手好几次了),这个过程,不在女神身上消耗精力

即——获取锁的周期更长,很难及时获取锁,但这个过程不用一直消耗CPU,可以让CPU处理别的事情

悲观锁=>重量级锁=>挂起等待锁

乐观锁=>轻量级锁=>自旋锁

对于synchronized来说,属于自适应锁         JVM内部,会统计每个锁竞争的激烈情况

如果竞争不激烈,此时synchronized 就会按照 轻量级锁(自旋锁)

如果竞争很激烈,此时synchronized 就会按照 重量级锁(挂起等待锁)

1.4 普通互斥锁 读写锁

普通互斥锁——synchronized 加锁 解锁

读写锁—— 读方式加锁 写方式加锁 解锁

多线程读取一个数据,线程本身是安全的

多个线程读取,一个线程修改数据,肯定涉及线程安全问题

由于 服务器开发中,读多写少的场景十分常见

大部分操作在读,少部分操作在 写——一旦给 读 写都加上普通互斥锁,锁冲突会很严重

   读写锁——确保 读锁和读锁之间不会互斥(不发生阻塞)

                                写锁和写锁之间 有互斥

                                写锁和读锁之间也有互斥

可以保证线程安全的前提下,降低锁冲突概率,提高效率

1.5 可重入锁 不可重入锁

synchronized 是“可重入锁”——一个线程一把锁,连续加锁多次,是否会死锁

核心要点:

  1. 锁要记录当前哪个线程持有这把锁
  2. 使用计数器,记录当前加锁次数,在合适的时候解锁

1.6 公平锁 非公平锁

synchronized是非公平锁

当女神和男朋友分手 谁上位才是公平的呢?

1.按照先来后到的顺序

2.概率均等

对锁来说,默认情况是概率均等,操作系统 对线程的调度是随机的

要想实现公平锁,需要付出额外的东西,

比如需要使用一个队列,记录一下,各个线程获取锁的顺序

1.7小结

对 synchronized 来说 属于

  • 自适应的
  • 普通互斥锁(不是读写锁) 
  • 可重入锁
  • 非公平锁

2. synchronized的锁升级过程

自适应过程(单向)

无锁=>偏向锁=>自旋锁=>重量级锁

偏向锁是指,进入synchronized后,并没有真的加锁,——是一种懒汉模式的体现

先简单做一个轻量标记,相比于加锁解锁 效率更高

  • 如果没有其他线程竞争此锁,最终当线程执行到解锁代码时 也只是清除标记,(不涉及真正的加锁解锁)
  • 如果有其他线程竞争此锁,就抢先一步,宣誓主权,真加锁,偏向锁=>轻量锁 其他线程只能等待

升级情况:

代码进入synchronized 的代码块—— 无锁=>偏向锁

拿到偏向锁的线程运行过程,发现其他线程尝试竞争这个锁——偏向锁=>自旋锁

JVM发现当前竞争锁的情况非常激烈——自旋锁=>重量级锁

当前JVM只提供“锁升级” 不能“锁降级”

3.锁消除

是编译器优化的一种体现,编译器会判断,当前代码逻辑是否真的需要加锁,如果确实不需要,会自动忽视synchronized

锁消除是比较保守的,没有100%的把握是不会去除的

4.锁粗化

锁的粒度

加锁和解锁之间,包含的代码越多,认为锁的粒度越粗

如果包含代码越少,则认为锁的粒度越细

此处代码指的不是代码行数,而是实际执行的指令/时间

一个代码中,反复针对细粒度代码加锁,可能会被优化更粗粒度的代码加锁

例如给领导汇报工作,一共三件事,如果没有提前组织好语言,打一次电话汇报一件事情,一共打三次电话才汇报完毕,领导都厌烦了。

打电话的时候,领导不能做别的事情,全身心投入到汇报中,

如果没有锁粗化,是一种低效率浪费资源的做法

如图示,将三处细粒度代码 优化成一段粗粒度代码

miRNA测序数据生信分析——第一讲,总结概述 这里的miRNA测序指转录水平的测序。这里每一个数据库都可以在线访问,但是如果要本地使用,都需要进行数据库文件下载,整理。 阅读详情

相关推荐

Windows下OpenMBEE项目MMS部署失败经历及改正

在Github里找到了上面的第一份文档,下载了MMS源代码(不知道为什么这个代码跟上面操作克隆得到的MMS代码不一样?好像是因为Gradle的版本问题,我本地之前已经安装过7.6.4的Gradle了,于是我找到gradle-wrapper.properties文件。后面在VScode中运行了一下依然是报这个错误,我在VScode终端直接执行。不知道为什么依然没什么用。打开“Windows PowerShell”。(如果是第一次运行它,将看到更长的输出)导航到要克隆存储库的文件夹,例如,

Yo_lan_da的博客 1868

【javaEE】多线程进阶(Part1 锁策略、CAS、synchronized )

1. 描述一下线程池的执行流程和拒绝策略有哪些?【面试题!】 2. 常见锁策略 + 面试题 3. CAS + CAS的ABA问题 + 面试题 4. synchronized原理(特点+加锁过程+优化手段)+面试题! 5. 面试题超级重要!!!

Xian meng在努力呐-的博客 1314

光模块数字诊断监控(DDM)功能

DDM(Digital Diagnostic Monitoring)数字诊断监控,由行业组织SFF Committee制定,遵循SFF-8472多源协议定义的标准参数而工作,规范了光模块和网络设备的软硬件所需遵循的标准数值或范围,确保了网络设备供应商和光模块供应商之间所提供产品的互操作性不同。:通过监测激光器的偏置电流来预测激光器的劣化,从而确保在故障发生之前将业务切换到备用链路上或替换有可能故障的光模块,因此起到了预测光模块寿命的作用。光模块DDM信息可以通过SNMP读取光模块的接收光功率和发射光功率。.

光模块的博客 2298

【JavaEE】多线程进阶问题-锁策略and死锁,CAS操作,Synchronized原理

在本文章中,讲解了一些多线程更细节的东西,例如锁的策略,这适用于很多语言、死锁的处理,CAS操作的讲解,synchronized的基本特点和原理。各种锁的详细讲解还有解决aba等经典的面熟问题!

Carefree_State的博客 1997

Python大数据舆情分析系统开发实战

舆情监测系统是大数据分析的重要应用场景,通过自然语言处理(NLP)技术解析社交媒体文本情感倾向。基于Python技术栈的解决方案整合了Scrapy爬虫框架进行数据采集,PySpark处理海量文本数据,结合SnowNLP和Jieba实现中文语义分析。系统采用微服务架构设计,包含数据采集层、处理层、存储层和应用层,通过情感分析优化和实时热点检测算法提升监测准确率。典型应用包括企业品牌监测、公共事件预警等场景,开发过程中需特别注意数据合规性和分布式集群的性能调优。

weixin_34408624的博客 386

2026年AI视频生成大模型全景指南:国内外主流工具深度对比与选型建议

AI视频生成技术在2025年至2026年间取得了突破性进展,从"能用"进化到"好用",商业化应用加速落地。中美双轨竞争格局基本成型,国内模型在技术追赶和本土化体验方面展现出强劲竞争力。对于用户而言,选择合适的AI视频生成工具需要综合考虑技术性能、使用门槛、成本预算和具体需求。零基础新手推荐海艺AI、通义万相等低门槛工具;进阶创作者可根据需求选择可灵AI、即梦AI、海艺AI等;专业开发者和企业用户可考虑智谱清影的开源能力或可灵AI的商业化服务。

nmdbbzcl的博客 2838

[JavaEE]synchronized 与 死锁

当某个线程执行到 synchronized 所修饰的对象时 , 该线程对象会加锁(lock) , 其他线程如果执行到同一个对象的 synchronized 就会产生阻塞等待.

Node_Hao的博客 2847

知识图谱实战应用8-从文本关系抽取到知识图谱关系构建流程贯通

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用8-从文本关系抽取到知识图谱关系构建流程贯通。我们从文本数据中采集到关键信息,并抽取出其中的关系信息,然后在存入图数据库中,整个过程实现自动化,我这里将举一个文本例子进行抽取。 对于知识图谱的构建是将实体、概念和它们之间的关系都以图表形式呈现出来的一种数据结构。要构建一个知识图谱,需要从不同的数据源中采集到相关信息,并将这些信息整合在一起,最终形成一个全面而且精确的知识图谱。

微学AI的博客 2544

【JavaEE初阶】 Synchronized 原理详解

我们可以看到, synchronized 的策略是比价复杂的, 在背后做了很多事情, 目的为了让程序猿哪怕啥都不懂,也不至于写出特别慢的程序1024程序节祝全体程序员万事如意、身体健康,节日快乐!

m0_71731682的博客 2590

实时系统vxWorks - 虚拟机环境搭建

概述VxWorks 操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的...

不只会拍照的程序猿 7850

2024顶级提示工程工具:提升效率的12个神器

LlamaIndex虽然本身不是直接的提示词编辑工具,但其整个设计都围绕着如何有效地将外部知识融入LLM的提示词。它提供了结构化的方式来管理“上下文窗口”——即哪些私有数据应该被包含在提示词中。通过优化索引结构和检索策略,可以确保提示词中包含最相关、最高质量的上下文信息,从而大幅提升LLM基于私有数据回答问题的准确性和相关性。同时,LlamaIndex允许开发者针对不同的查询类型和数据特点定制提示词模板,这使得提示词的复用和优化更加系统化。

AIGC应用创新大全的博客 1098

【JavaEE】锁的策略

加锁策略,面试常考题!!!

做梦都想要三十万年薪~ 4086

YOLOv10改进 | 主干篇 | 引入FasterNet:Run, Don‘t Walk,追求更快的神经网络

本文引入了 FasterNet 作为 YOLOv10 的主干网络。通过 PConv 算子,我们有效降低了模型的计算冗余。对于追求极致推理速度的场景(如树莓派、Jetson Nano),该改进方案极具价值。建议在训练时配合混合精度训练 (AMP)进一步加速。

weixin_51988935的博客 604

JavaEE多线程进阶

本文对多线程中一些锁策略进行了介绍,重点讲了synchronnized的锁升级、锁消除、锁粗化技术介绍,也探讨了CAS原理在源自类和自旋锁的应用以及ABA的问题解决

2401_89019969的博客 1323

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【Java EE】总结12种锁策略以及synchronized的实现原理

总结来说,选择悲观锁还是乐观锁取决于具体的业务场景和并发程度,悲观锁适用于冲突概率较高、对数据一致性要求严格的场景,而乐观锁适用于冲突较少、追求高并发性能的场景。在Java中,这两种锁策略的表现形式并不是直接作为API提供,而是JVM在实现锁机制时采取的策略,例如在自旋锁策略失效后,JVM会升级锁为重量级锁,这时线程就会进入挂起等待状态。在现代Java虚拟机中,锁机制往往是复合的,包括偏向锁、轻量级锁、重量级锁等不同层次的设计,其中轻量级锁在一定程度上借鉴了自旋锁的思想。

xiaoxie8023的博客 3092

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【JavaEE】synchronized 原理

synchronized的加锁过程以及锁消除和锁粗化的优化

不能再留遗憾了的博客 1281

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

[JAVAEE] 面试题(一) - 锁策略, synchronized的详细介绍

锁策略, synchronized的详细介绍

nmbg11的博客 1287

【JavaEE】多线程进阶(1)

常见的策略锁,CAS的工作原理、如何实现原子类,自旋锁以及存在的ABA问题,synchronized的特性,以及其他优化措施

2303_77535762的博客 1160

【JavaEE初阶】深入理解不同锁的意义,synchronized的加锁过程理解以及CAS的原子性实现(面试经典题);

本期讲解了关于不同锁的基本概念,包括我们经常使用synchronized的加锁过程包含的“锁升级,锁消除,锁粗化”的一系列的操作,以及CAS的实现和我们之前线程安全的代码的举例

GGBond778的博客 2250

【JavaEE】锁(三):锁策略

还在为Java锁的选择头疼?悲观锁vs乐观锁该怎么挑?synchronized的自适应升级到底藏着什么逻辑?这篇文章帮你彻底理清! 从锁竞争场景出发,拆解悲观/乐观、重量级/轻量级等锁的适配逻辑,详解公平/非公平锁的实现差异,深挖读写锁的优先级机制与适用场景。重点剖析synchronized从偏向锁、轻量级锁到重量级锁的单向升级流程,搭配锁粗化、锁消除等优化技巧,让你搞懂不同场景下"锁的最优解"。 不管是面试高频提问,还是开发中锁的实际选型,这份清晰易懂的锁知识梳理都能帮你轻松应对!

Brookty的博客 1216

【javaEE】多线程(进阶)

比如我的账户里面有2000块钱(状态A),我委托张三说:如果我忘给李四转1000块钱,下午帮我转一下,我在中午给李四转了1000块钱(状态B),但是随后公司发奖金1000到我的账户,此时我账户有1000块钱(状态A),张三下午检查我账户,发现我有2000块钱,于是又给李四转了1000块钱,此时就出现问题了,李四收到了两次1000元,不符合我们的需求了.缩小了锁的粒度,不再将整个数组都加锁,对每个链表都分配了一把锁(将每个链表的头节点对象设为锁),只有当多个线程访问同一个链表时,才会产生锁冲突。

Easonmax的博客 1090

【JavaEE】synchronized原理

本篇主要讲解synchronized的原理,以及相关优化技术,以及面试题

zhyhgx的博客 1517

javaEE初阶————多线程进阶(1)

CAS 即 compare and swap 比较和交换,CAS是CPU上的一条指令,它有三个参数,一个是内存地址,另两个都是寄存器的值,我们要表内存地址和寄存器1的值是否相等,如果相等就把寄存器2的值赋值给内存地址;我们学过,CAS是CPU的一段指令,它的工作原理是比较和交换,既然是原子的那就完全没有线程安全问题了吗,我们来举一个极端的例子,我们把A改成B,之后另一个线程过来吧B改成A,我们第三个线程过来的时候看此时数据还是A,那不就是没改吗,可实际代码已经改过一次了;

2301_79083481的博客 1811

【JavaEE 初阶(四)】多线程进阶

锁策略,悲观锁vs乐观锁,轻量级锁vs重量级锁,自旋锁vs挂起锁,读写锁,可重入锁vs不可重入锁,公平锁vs非公平锁,锁升级,锁消除,锁粗化,CAS,Callable 接口

weixin_69049913的博客 1557

【JavaEE】锁策略

本篇主要讲解锁策略以及一些相关面试题

zhyhgx的博客 1887

【JavaEE】Java中复杂的Synchronized关键字

偏向锁不是真的 "加锁", 只是给对象头中做一个 "偏向锁的标记",记录这个锁属于哪个线程。如果后续有其他线程来竞争该锁,因为刚才已经在锁对象中记录了当前锁属于哪个线程了, 很容易识别当前申请锁的线程是不是之前记录的线程, 那就取消原来的偏向锁状态, 进入一般的轻量级锁状态。经历了一系列的操作, 这个锁被其他线程释放了, 操作系统也想起了这个挂起的线程,于是唤醒。假设有 A B C 三个线程,线程 A 先获取到锁,然后 B 尝试获取锁, 然后 C 再尝试获取锁,此时 B和 C 都在阻塞队列中排队等待。

m0_63372226的博客 3186
上一篇: JavaEE初阶(8)——自定义线程池&&自定义定时器
下一篇: JavaEE进阶(2)——Synchronized与ReentrantLock的区别
FrantF
博客等级 码龄3年 5粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值