Java 锁

【硬件相关】IB网与以太网核心技术解析及高性能网络部署指南 本文深入解析了IB网与以太网的核心技术差异,包括协议栈、流量控制机制及硬件架构,并提供了高性能网络部署的实战指南。通过对比测试和调优案例,展示了IB网在低延迟和高负载下的优势,以及混合组网中的创新应用,助力超算集群和高效网络部署。 阅读详情

本篇计划总结一下,Java中最基本的锁,以及springboot分布式锁的redis实现

1 锁 一般是抽象的概念,Java中有具体的对象和关键字,来实现这些锁,下面介绍这些锁

      synchronized  ,这是一个关键字,用来做线程锁,也是悲观锁 同步锁,当一个线程执行了被synchronized修饰的方法或代码块时,其他线程,将无法访问这个锁内的代码块,但是可以访问持有这个锁的线程的其他代码块。

       非公平性:多个线程竞争一个synchronized 锁时,是随机分配给某个线程的,所以,synchronized 也是非公平锁。

        可重入性:同一个线程,这个线程可以反复进入自己持有锁的代码块,这样做,每次进入后,持有的锁会+1,会记录持有锁的线程id。

        static synchronized:锁住一个class类(普通synchronized锁住当前对象,即this)

        偏向锁,轻量级锁,重量级锁:synchronized锁住一个代码块后,其他线程无法访问,这会导致性能低下,因此有了这三种锁来优化synchronized。

         偏向锁:一个锁,一直被同一个线程访问,当这个线程已经获取过这个锁,再次想要获取这个锁时,不需要加锁就能访问锁内的代码块。

          轻量级锁:出现一个新的线程,对偏向锁中的线程进行竞争一个锁,此时,新的线程会进入自旋,即持续等待,此时,就是轻量级锁。

          重量级锁:轻量级锁的自旋一直存在,自旋一定次数后,升级为重量级锁,重量级锁就是最早的synchronized,会拒绝其他线程访问被锁住的代码块,这些线程将被挂起,进入阻塞。

2 CAS

这是一种乐观锁的实现:先查询需要修改的值,然后要进行修改时再次查询,如果两次结果一致,可以进行后面的修改这个值的操作,否则不断重复这个流程,进入自旋,直到可以修改,或者放弃修改。

 具体实现类:AtomicInteger  AtomicBoolean 等

3 ReenTrantLock

sync类重入获取资源:一种对同一个线程可重入锁,每次同一个线程重入,则state记录次数并+1,如果之前没有线程持有锁,则cas操作,将这个次数变为1。使用CAS来修改state的值,获取锁的sync类继承了AQS。

释放锁:对于同一个线程,每次将它的state -1,当state变成0的时候,将持有这个锁的线程清空,具体方法:setExclusiveOwnerThread(null)

非公平获取锁和资源:直接cas设置state,成功获取锁,失败进入队列等待。(非公平体现在等待队列之外的线程也会用同样的方式获取锁)

公平地获取锁和资源:state为0,要去cas给这个线程获取锁前,先判断这个线程是否在等待队列中。

4 ReentrantReadWriteLock 

读写锁,分为读锁和写锁,读锁持有的时候不能再获取该资源的写锁,其他线程都能读,写锁持有的时候,其他线程不能读。

   写锁获取锁:先查看资源是否被其他线程持有锁,再查看写锁的数量,可以则重入,state+1

                具体情况:如果写锁数量不为0,查询持有锁线程是否为当前线程,是则重入,不是则                                      拒绝,可以重入还有判断是否超过写锁数量上限。

   写锁释放:直接getstate-1,直到清除完,然后将持有资源的线程id置为null。                              

   获取读锁:有写锁无法获取,只有读锁时,判断持有锁数量,不超过上限,state+1

   读锁释放:使用CAS修改state 这个锁的数量。

5 AQS

一个抽象类,类中一些关键对象:

         1 Node, 关键变量都用volatile修饰,事实上是一个双向链表,记录了上一个节点和下一个节             点的信息。exclusiveOwnerThread 记录当前持有锁的线程id,

   

【原理图PCB专题】原理图图纸锁定/解锁与PCB文件加密方式 在工作中我们会遇到需要冻结原理图进行评审和加密图纸防止被他人盗用的需求。那么在OrCAD Capture中如何对图纸进行锁定与解锁,如何在Allegro中对PCB工程进行加密呢? 阅读详情

相关推荐

python代码爬取大众点评评论!直接copy就可以运行!

python代码爬取大众点评评论!直接copy就可以运行!

QiuQiRuQin的博客 1万+

2020-12-07 HowTo: Check If a String Exists

https://stackoverflow.com/questions/7522712/how-can-i-check-if-a-command-exists-in-a-shell-script https://www.shellhacks.com/check-if-string-exists/ https://www.unix.com/shell-programming-and-scripting/259572-check-if-string-exists-file.html a="he..

o_alpha的博客 164

AI 生成测试报告:从 2 小时到 10 分钟

本文分享了AI在汽车电子测试报告生成中的应用案例。作者以某车企ECU测试项目为例,对比传统报告方式(每天2小时)与AI辅助方式(每天20分钟),效率提升83%。文章详细介绍了测试报告的核心要素(测试概况、结果、问题分析、发布建议)和不同类型报告(日报、周报、总结报告)的特点,并提供了从CANoe导出测试数据的Python解析脚本示例。通过AI自动化处理,大幅减少了测试工程师在报告整理上的时间投入,为汽车电子测试工作提供了实用效率提升方案。

小明的博客 443

List.Exists 方法和几种字符串去重方法

今天群里提了一个小问题:给出一个字符串"abcabc12345612ab";能不能用某种方式去除重复 字符,输出 "abc123456"的形式.   我的想法是首先构造一个List,然后将打印后的字符传到List里面,如果List.Exists这个字符,就不输出,否则,添加到List里面,然后输出此字符.结果就差一秒啊,发现List.Exists 方法和我想的不一样,中间传的不是string,而

不喝橙汁 4142

【STM32】BLDC驱动&控制开发笔记 | 07_SPI通信测试 - STM32F407用SPI配置DRV8323驱动芯片

使用STM32F407的SPI通信功能配置DRV8323S驱动芯片的详细过程说明。

这里是 F菌的进阶之路。 6289

Python实战:用pdfplumber从PDF中精准提取表格数据(附完整代码)

本文详细介绍了如何使用Python库pdfplumber从PDF中精准提取表格数据,包括环境配置、标准与复杂表格处理策略、数据清洗与验证等实战技巧。通过完整代码示例,帮助数据分析师和财务专业人士实现PDF数据提取的自动化,提升工作效率。

weixin_29061821的博客 398

字符串中判断存在的几种模式和效率(string.contains、string.IndexOf、Regex.Match)

通常情况下,我们判断一个字符串中是否存在某值常常会用string.contains,其实判断一个字符串中存在某值的方法有很多种,最常用的就是前述所说的string.contains,相对来说比较常用的还有string.IndexOf和Regex.Match。直接上代码,后面在说些什么吧,通常情况下功能的实现最重要,作者的话,只对有心者有效。   using System; usi...

weixin_34406086的博客 2728

手把手教你为ArduPilot添加自定义飞行模式:以自动巡检航线为例

本文详细介绍了如何为开源飞控ArduPilot添加自定义飞行模式,并以自动巡检航线为例,提供了从状态机设计、代码实现到地面站集成的完整开发指南。通过七步法手把手教学,帮助开发者深入理解飞控核心逻辑,实现无人机自主执行复杂巡检任务,满足行业应用定制需求。

weixin_29306875的博客 135

背包九讲的个人理解

主要写背包问题最优算法的个人注释,暂时先写0-1背包,完全背包,多重背包,详细基础看https://mp.youkuaiyun.com/postedit0-1 背包:weight 物体重量value 物体价值w背包可承受上限for  i=1;i<=n;i++    for j=w;j>=1;j--        if(j>weight[i])            bag[j]=max(ba...

stringexists的博客 317

STM32F103C8T6蓝莓派用HAL库GPIO模拟SPI驱动MAX31865读取PT100温度(附完整代码)

本文详细介绍了如何在STM32F103C8T6蓝莓派开发板上使用HAL库通过GPIO模拟SPI驱动MAX31865读取PT100温度传感器的完整方案。内容包括硬件连接、CubeMX配置、GPIO模拟SPI实现、温度计算算法及常见问题排查,并附有完整代码示例,帮助开发者快速实现高精度温度测量。

weixin_30684743的博客 935

EtherCAT主站SOEM -- 0 -- 该EtherCAT主站SOEM专栏后续安排

SOEM(Simple Open EtherCAT Master)是一个开源的EtherCAT主站库,允许开发者构建自定义的EtherCAT主站应用程序。EtherCAT是一种实时以太网通信协议,广泛应用于工业自动化和机器控制领域。开源性质:SOEM是一个开源项目,这意味着开发者可以自由地查看、修改和分发代码。这使其成为工业自动化领域的一个强大工具,可以根据具体需求进行定制。EtherCAT主站实现:SOEM库提供了一个完整的EtherCAT主站实现,允许主站与多个EtherCAT从站设备进行通信。

常驻客栈的博客--嵌入式EtherCAT 6663

Java 公平锁与非公平锁详解

对比维度公平锁非公平锁排队机制严格遵守FIFO允许插队吞吐量较低较高响应时间可预测不确定实现难度较复杂较简单避免饥饿能不能核心结论公平锁保障绝对的请求顺序非公平锁提供更高的吞吐量Java中锁的默认行为是非公平的(符合大多数场景)在需要严格顺序的业务中才使用公平锁。

yuren_xia的博客 999

避坑指南!YOLO26模型导出/推理常见问题,99%的开发者都踩过

版本锁定:Ultralytics=8.4.2、OpenVINO=2024.0.0、Python=3.10,版本不一致是80%问题的根源;参数对齐:训练/导出/推理的imgsz、归一化、坐标映射必须完全一致,差一步就出错;算子统一:避免自定义算子,优先用YOLO26原生算子(C3k2/PSABlock),确保推理引擎兼容;分步验证:导出后先校验ONNX/IR模型→单图片推理→RTSP流推理→72小时稳定性测试,一步过易踩坑;工业级测试。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 510

java锁Synchronized锁膨胀

在java中,synchronized锁的膨胀是指锁从轻量级状态逐步升级为更重的状态,以适应并发情况的变化。这种锁升级机制是为了在不同的线程竞争强度下提供合适的锁实现,最大化性能。锁的膨胀过程从“无锁”到“偏向锁”,再到“轻量级锁”,最终可能升级为“重量级锁”。这个机制通过减少不必要的线程阻塞和上下文切换,提高了性能。

weixin_41863236的博客 2016

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java的锁概括

java的锁概括

qq_40453972的博客 1684

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java锁的种类

概述 锁大概有以下名词: 自旋锁、自旋锁的其他种类、阻塞锁、可重入锁、读写锁、互斥锁、悲观锁、乐观锁、公平锁、偏向锁、对象锁、线程锁、锁粗化、锁消除、轻量级锁、重量级锁、信号量、独享锁、共享锁、分段锁。 我们所说锁的分类其实应该按照锁的特性和设计来划分。 其实从并发的角度来讲,按照线程安全的三种策略看,主要内容都集中在互斥同步里,我们所讨论的锁也集中在这个部分,这个部分的锁都是悲观锁;第二个部分是非阻塞同步,这个部分也就一种通过CAS进行原子类操作,这个部分可以看成乐观锁,其实也就是不加锁;第三个部分是无同

抽象的螺旋 6227

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java锁——什么是锁?

锁的概念基础与一些底层的分析

泯灭于众生,高歌于孤夜! 2490

Java锁

但是如果锁的竞争激烈,或者持有锁的线程需要长时间占用锁执行同步块,这时候就不适合使用自旋锁了,因为自旋锁在获取锁前一直都是占用 cpu 做无用功,占着 XX 不 XX,同时有大量线程在竞争一个锁,会导致获取锁的时间很长,线程自旋的消耗大于线程阻塞挂起操作的消耗,其它需要 cup 的线程又不能获取到 cpu,造成 cpu 的浪费。当事务想要获取某些行的排他锁时,它必须先获得表的意向排他锁。但是,通过意向锁,可以使得事务A等待的是表级锁的意向锁的释放,而事务B等待的是行级锁的意向锁的释放,这样可以避免死锁。

刘皇叔说Java的博客 1502

Java中到底有哪些锁

读锁是共享锁,写锁是独享锁。在代码进入同步块的时候,如果同步对象锁状态为无锁状态(锁标志位为“01”状态,是否为偏向锁为“0”),虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间,用于存储锁对象目前的Mark Word的拷贝,然后拷贝对象头中的Mark Word复制到锁记录中。如果轻量级锁的更新操作失败了,虚拟机首先会检查对象的Mark Word是否指向当前线程的栈帧,如果是就说明当前线程已经拥有了这个对象的锁,那就可以直接进入同步块继续执行,否则说明多个线程竞争锁。

SevenCoding的博客 1405

java—锁

1:这篇我们讲到了一些不同特性的锁,如悲观乐观,重量轻量等2:然后我们又讲到了CAS比较并交换的工作原理,以及它的ABA问题3:同时我们又谈到了sychronized的底层原理,以及早期sychronized的问题,并进行的锁升级的优化改进等。4:然后又对锁消除和锁粗化进行了大概的意思阐述。

m0_73233932的博客 1199

Java中有哪些锁?

是 Java 最基础的锁机制,用于实现方法或代码块的同步,保证多线程环境下的原子性、可见性和有序性。竞争激烈时,线程进入阻塞状态,依赖操作系统的互斥量(Mutex)管理。提供更灵活的读写锁控制,支持乐观读、悲观读、写锁三种模式,性能优于。允许多个线程同时读,但写线程独占资源,适用于读多写少的场景。读多写少且对性能要求极高的场景,但需谨慎处理锁转换逻辑。:默认抢占式获取锁,不保证等待时间长的线程优先获取。需要复杂同步控制的场景,如多条件等待、锁超时处理。:写线程获取锁时,禁止其他读/写操作。

qq_45906596的博客 2826

Java 公平锁与非公平锁

公平锁与非公平锁: 锁Lock分为公平锁和非公平锁。 公平锁:表示线程获取锁的顺序是按照加锁的顺序来分配的,及先来先得,先进先出的顺序。 非公平锁:表示获取锁的抢占机制,是随机获取锁的,和公平锁不一样的就是先来的不一定能拿到锁, 有可能一直拿不到锁,所以结果不公平。 公平锁实例: public class Service { private ReentrantLock lock; pub...

抛弃幻想,准备斗争 6762

Java中常见的锁

Java中常见的锁 一、悲观锁,乐观锁 1、悲观锁 定义:对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有其他线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被其他线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。 2、乐观锁 定义:在并发操作时,认为不会有其他的线程来修改数据,所以不会加锁。在更新数据的时候会判断有没有其他线程更新这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入,如果数据已经被其他线程更新,则会根据不同的实现方

youngjre的博客 3440

Java并发 - Java中所有的锁

Java 中提供了多种锁机制,用于实现多线程之间的同步和互斥。

--土拨鼠-- 2308

Java中锁的分类

Java中锁的分类1、可重入锁/不可重入锁2、可中断锁3、公平锁/非公平锁4、独享锁(互斥锁)/共享锁(读写锁)5、乐观锁/悲观锁6、分段锁7、偏向锁/轻量级锁/重量级锁8、自旋锁 先来一段很常见的死锁代码: class Deadlock { public static String str1 = "str1"; public static String str2 = "str2"...

@龙猫的博客 3617

java 有多少种锁_java有哪些锁?java锁种类盘点

学习java一定要全方面的了解java的知识,这样才能更好的运用到工作中去,比如java锁的知识点,那么接下来,我们就来给大家讲解一下java锁种类。大家可以参考以下文章。1.公平锁/非公平锁公平锁是指多个线程按照申请锁的顺序来获取锁。非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。2.可重入锁可重入锁又名递...

weixin_35645813的博客 4111
上一篇: redis 设置 mybatis数据库主键自增值
下一篇: springboot 定时任务
stringexists
博客等级 码龄9年 2粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值