Java锁相关问题

news/2025/9/25 18:14:03/文章来源:https://www.cnblogs.com/sunnycc/p/19111711

1.Java中有那些锁,区别是什么

1.java中的锁主要分为乐观锁和悲观锁,其中CAS是乐观锁,synchronized、Lock是悲观锁。
2.乐观锁认为我在操作的时候不会有其余的线程竞争,如果有竞争就自旋等待(CAS)或异常结束(数据库多版本机制)
3.悲观锁认为我操作的时候一定会有其余的线程竞争,如果我未竞争到锁就结束或阻塞等待(tryLock)。

 

2.CAS实现原理

1.CAS是乐观锁思想实现的,主要解决线程并发问题,其原理是新值、旧值、预期值的比较与交换,当且仅当旧址和预期值相同的情况才会把旧址改为新值,JAVA中是基于unsafe类提供的方法实现的,CAS是CPU基本的原子操作 。
2.java中Atomic类的方法是基于CAS实现的,MySql数据的多版本控制也是基于CAS实现的。
3.CAS存在ABA问题。当共享变量经历A→B→A的值变化时,CAS仅检查最终值是否与预期值相同(均为A),而忽略中间被修改为B的过程,导致逻辑误判。JAVA中提供了解决ABA的方案,可以使用AtomicstampedReference<V>来解决。

 

3.synchronized实现原理和锁升级

v2-2141a3ddf65d446898152fab397cace4_r

 

1.synchronized是一共互斥锁,只能有个线程持有这把锁,synchronized中有个owner属性,owner存放的是持有当前锁的线程,当owner为null的时候其余线程可以通过CAS进行owner修改,如果修改成功则当前线程持有锁,如果修改失败则进行几次CAS,没有拿到就信息park挂起线程。

4.synchronized锁升级过程。
1.无锁:当前对象没有被任何锁资源占用&&在JDK1.8后会有个4S的偏向锁延迟,JVM刚刚启动的4S中,不存在偏向锁状态。
2.偏向锁:

1.撇去4S的延迟,刚创建出来的都行都是偏向锁(匿名偏向)
2.当前对象被作为锁资源占用,且指向了某一线程此时就是偏向锁(普通偏向)
3.如果一个线程执行任务后,反复的获取同一把锁,这个时候偏向锁的优势就体现出来了,无需进行CAS操作,直接比较线程指向是否相同,相同则直接获取锁。

 

3.轻量级锁:在偏向锁的状态下,锁资源出现了竞争,就会升级为轻量锁。轻量锁状态下会进行几次CAS操作将owner(monitor中的owner)修改为自己的线程,默认是10次,这里的CAS操作走的自适应自旋锁。
4.重量级锁:在轻量级锁状态下,轻量级锁竞争失败,就会升级为重量级锁,重量级锁也会进行几次CAS操作将owner(monitor中的owner)修改为自己的线程,如果成功就直接拿锁执行任务,如果失败则挂起线程,等起锁释放后被唤醒。

    private void synchronizedTest1(){//1.无锁状态    没有被任何锁资源占用且在JVM启动4S内Object o = new Object();synchronized (o){//2.轻量级锁
        }}private void synchronizedTest2(){try {//模拟JVM启动耗时Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}//3.偏向锁的匿名偏向Object o = new Object();synchronized (o){//4.偏向锁的普通偏向
        }}
}

 

4.Synchronized和ReentrantLock的区别

1.Synchronized是java内置关键字,是JVM基于内置关键字monitor实现,Synchronized是公平锁,内置自动加锁和释放锁,是可重入锁,发生异常时自动释放锁。
2.ReentrantLock是API级别的,基于AQS(AbstractQueuedSynchronized实现。ReentrantLock根据参数属性控制是公平还所非公平锁,需显示调用lock(),unLock()进行加锁和释放锁,使用ReenTrantLock锁进行线程间的通信需要依赖Condition进行,也是可重入锁,可中断和尝试获取锁,发生异常时需要在finally内释放锁。

 

5.AQS是什么

v2-eca00ffe477259faefc4c28dde4034f7_r

 

1.AQS(AbstractQueuedSynchronized)其实JUC下一个基础类,没有具体是实现并发功能,但是大多数JUC包下的类都继承了AQS,如;ReentrantLock,CountDownLatch、线程池等等、
2.AQS核心的是同步状态管理和线程队列机制

1.AQS中有一个被volitail修饰的state,当state = 0时表示没有线程持有锁资源,当state>0时表现有线程持有资源。
2.Node节点组成的双向队列:当出现锁竞争的时候,未竞争到锁的线程会作为node节点存放到双向队列中。
3.Node对象节点组成的单向链表:当线程持有锁的时候执行了await命令,线程会释放锁,此时当前线程会作为node节点存放到单线链表中,当接受到signal时会从单向链表转移到双向队列参与锁竞争。

 

6.公平锁和非公平锁的区别

v2-1216f0ef40df4ca02005f03df7b4ae76_r

 

1.公平锁支持先进先出,先到的线程先获取锁。
2.非公平锁允许线程执行CAS竞争,谁拿到锁谁就去执行任务,其余的就排队。
3.synchronized是公平锁的代表,ReenTrantLocak可通过属性设置公平非公平。
4.ReentrantLock中有两个方法决定实现公平和非公平之分。

lock:
非公平锁:线程直接执行CAS尝试将state从0修改为1,如果修改成功拿锁走人,修改失败调用tryAcquire。
公平锁:执行执行tryAcqurie。tryacquire方法:
非公平锁:线程直接执行CAS尝试将state从0修改为1,如果修改成功拿锁走人,失败了就排队。
公平锁:如果state=0且有线程排队则直接给最先进来的线程。

 

7.系统中分布式锁是如何使用的,分布式锁有几种实现方式


1.在分布式系统/微服务系统的情况多线程并发竞争同一资源这个时候就需要使用分布式锁。
2.分布式锁有redis、redission,lua脚本、zookeeper
3.redis分布式锁可以使用setnx来进行加锁和释放锁,setnx命令保证我对某个key设置值之后其余命令无法在设置,但是加锁后执行业务逻辑时程序停止或重启了,就会导致当前key长生不老,就会导致次业务因无法获取锁而崩溃。
4.可以使用setnx+expire来做分布锁,这样锁就有过期时间了,在执行业务逻辑时程序崩溃也会释放锁,当时setnx+expire是非原子的,两者之间也存在程序崩溃后锁无法释放的问题。
5.可以使用redis的set(key,value,nx,ex,时间单位)来做分布式做,redis层面保证命令是原子的。但是代码书写时要把加锁操作放到try()cathc()finally()外,避免因当前线程加锁失败删除掉别的线程锁。
6.可以使用redission提高的命令做锁,redission有自动续费看门狗机制、集群之间容错机制,支持可重入机制。

94fa389b20754bc4ad3a1e561ed2693e

 

8. CountDownLatch 和CyclicBarrier和Semaphore 的作用和区别

1.CountDownLatch主要作用是主线程等待所有被调用线程结束,才会执行,每次调用countDown()方法计算器进行减1,当结果减为0时,主线程执行。CountDownLatch内部是基于CAS操作执行的,不可重置
2.CyclicBarrier主要作用是线程直接互相等待,当最慢的线程结束才会一块进行后续操作。每次调用await()方法时计算器进行加1,当结果加到执行数值,所有线程才会执行await()后面的逻辑。 CyclicBarrier是基于reenTrantLock原理实现的,可重置。
3.Semaphore主要作用类似线程之间的凭证,当线程拿到屏障后才会执行,如果没有拿到就需要等待,当别人释放后自己取抢。Semaphore内部是基于CAS操作执行的 计数时可增可见、可动态控制许可数量。
示例:
CountDownLatch相当于在田径接力比赛时所有人员到齐了,活动才开始。
Semaphore相等于运动员手里的接力棒,只有下一个队员拿到接力棒后才可以跑。
CyclicBarrier相当于所有的接力运动员都跑完了,大家一块去吃烧烤。

 

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

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

相关文章

CDN中使用边缘函数实现自定义编程

本文分享自天翼云开发者社区《CDN中使用边缘函数实现自定义编程》.作者:郭****迎 为什么选择边缘函数千人千面,个性化定制,源站计算成本高: 企业网站为了提升用户转化率,往往需要在源站服务器根据用户历史数据,计…

第一次课程中的所有动手动脑的问题以及课后实验性的问题

第一次课程中的所有动手动脑的问题以及课后实验性的问题 (我将其以压缩包的形式上传到了博客的文件中) https://files.cnblogs.com/files/blogs/848082/第一次课程.zip?t=1758794756&download=true (一)枚举类…

敏捷开发的几个阶段

目录阶段1:认知启蒙期(入门)——“知道敏捷是什么”阶段特征:阶段2:实践落地期(初级)——“能用敏捷做项目”阶段特征:阶段3:问题优化期(中级)——“能解决敏捷中的坑”阶段特征:阶段4:体系化期(高级)—…

公司网站开发怎么做账wordpress更新网站内容

python脚本查找文件是否存在的方法&#xff1a;1、使用os模块os模块中的os.path.exists()方法用于检验文件是否存在。判断文件是否存在import osos.path.exists(test_file.txt)#Trueos.path.exists(no_exist_file.txt)#False2、使用Try语句可以在程序中直接使用open()方法来检查…

网站建设一年600js做的网站

java微服务面试题 Q:为什么要用微服务&#xff1f;微服务有哪些优势&#xff1f; 单体应用把所有功能都堆放在一起&#xff0c;改动影响大&#xff0c;风险高。 微服务具有以下优势&#xff1a; 针对特定服务发布&#xff0c;影响小&#xff0c;风险小&#xff0c;成本低。 频…

青岛seo网站建设公司软件网页制作

面向对象编程特征&#xff1a;抽象化&#xff0c;讲究对象&#xff0c;集成&#xff0c;封装&#xff0c;多态。 类&#xff1a;一类事物&#xff0c;苹果&#xff0c;梨&#xff0c;香蕉都是水果&#xff0c;都是一类。 类的特征&#xff1a;构造函数&#xff0c;字段属性和方…

实战:基于 BRPC+Etcd 打造轻量级 RPC 服务 —— 从注册到调用的完整实现 - 教程

实战:基于 BRPC+Etcd 打造轻量级 RPC 服务 —— 从注册到调用的完整实现 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-…

【2025最新】ArcGIS 点聚合功能实现全教程(进阶版) - 实践

【2025最新】ArcGIS 点聚合功能实现全教程(进阶版) - 实践2025-09-25 18:04 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importa…

隐藏在众目睽睽之下:从PEB中解除恶意DLL的链接

本文深入探讨了一种恶意软件用于隐藏注入DLL的反取证技术。详细解析了Windows进程环境块(PEB)的结构,并展示了如何通过操作PEB中的三重双向链表来隐藏已加载的恶意DLL,包括具体的代码实现和检测方法。隐藏在众目睽睽…

详细介绍:Java 领域中 Java-EE 的异步编程实现

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

营销型网站公司名称手机wap网站模板 带后台

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 单点登录SSO&#xff08;Single Sign On&#xff09;说得简单点就是在一个多系统共存的环境下&#xff0c;用户在一处登录后&#xff0c;…

网站qq聊天代码深圳网站建设公司服务商

mqtt&#xff1a;轻量级物联网消息推送协议。 目录 一、介绍 1、官方文档 1&#xff09;npm网 2) 中文网 MQTT中文网_MQTT 物联网接入平台-MQTT.CN 2、官方示例 二、准备工作 1、安装依赖包 2、示例版本 三、使用步骤 1、在单页面引入 mqtt 四、完整示例 tips 一、介…

设计模式六大原则 - 实践

设计模式六大原则 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &q…

徐霞客的《青云志》

徐霞客的《青云志》明代著名的旅行家和地理学家徐霞客的《青云志》在网络上炒得火爆。全文是: “身处低谷不自弃,我命由我不由天。 无人扶我青云志,我自踏雪至山巅。 若是命中无此运,亦可孤身登昆仑。 红尘赠我三尺…

深入解析:豆包Seedream 4.0:全面测评、玩法探索与Prompt解读

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

运营商 API 安全最佳实践、案例与方案推荐(2025)|千万级接口的全链路实战

在 5G、云原生与边缘协同的现实架构里,运营商的 API 安全应遵循一条清晰主线:资产可视 → 行为基线 → 联动处置 → 可审计证据。落地层面需要可度量、可复核的硬指标作为抓手,例如 分钟级增量捕获、告警≤0.5s、MT…

HyperWorks许可与多用户支持

在工程项目中,软件许可管理和多用户支持是确保团队协作顺畅进行的核心要素。HyperWorks作为一款领先的工程仿真软件,不仅提供了灵活的许可管理方案,还具备卓越的多用户支持功能,助力团队高效协作,共创卓越成果。 …

免费素材库短视频素材网站如何做网站知乎

大家都知道光模块是影响整个网络性能的关键因素&#xff0c;特别是在工业以太网中&#xff0c;网络连接控制的多为大型工业设备&#xff0c;光模块的稳定性尤为重要&#xff0c;那么&#xff0c;我们该如何选购工业级光模块呢&#xff1f;接下来就由飞畅科技的小编来为大家详细…

破局与进化:火山引擎Data Agent从落地实践到架构未来

本文为火山引擎技术专家陈硕,在AICon全球人工智能与机器学习技术大会上的演讲分享。本文围绕以下五部分展开:Data Agent整体介绍 智能分析Agent产品演进 智能分析Agent技术架构演进 智能分析Agent落地新进展 Data Ag…

建立网站平台做ppt的软件怎么下载网站

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;链表转数组方法二&#xff1a;自顶向下归并排序方法三&#xff1a;自底向上的归并排序 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内…