多把锁以及线程死锁问题

Java多线程--多个对象多个锁 上一篇博客中介绍了多个线程同时访问一个对象,产生一个对象锁,属于同步访问,现在介绍下如果是访问多个对象,会怎么执行那? Demo: HasSelfPrivateNum类: public class HasSelfPrivateNum { private int num=0; synchronized public void addI(String username){ ... 阅读详情

在 Java 中,每一个对象都可以作为一把锁,synchronized 通过获取对象头中的锁标志位来实现同步。当一个线程获取到对象的锁后,其他线程就无法再获取该锁,只能等待获取到锁的线程释放锁之后才能继续执行被 synchronized 修饰的代码块或方法。synchronized 本质上就是 Java 语言层面实现的一种互斥锁

背景

为了增加并发度,降低锁的粒度,增加多把锁;

一间大屋子有两个功能:睡觉、学习,互不相干。 现在小南要学习,小女要睡觉,但如果只用一间屋子(一个对象锁)的话,那么并发度很低 解决方法是准备多个房间(多个对象锁)

package cn.itcast.n4;

import static cn.itcast.n2.util.Sleeper.sleep;

import cn.itcast.n2.util.Sleeper;
import lombok.extern.slf4j.Slf4j;

public class TestMultiLock {
    public static void main(String[] args) {
        BigRoom bigRoom = new BigRoom();
        new Thread(() -> {
            bigRoom.study();
        },"小南").start();
        new Thread(() -> {
            bigRoom.sleep();
        },"小女").start();
    }
}

@Slf4j(topic = "c.BigRoom")
class BigRoom {

    private final Object studyRoom = new Object();

    private final Object bedRoom = new Object();

    public void sleep() {
        synchronized (bedRoom) {
            log.debug("sleeping 2 小时");
            Sleeper.sleep(2);
        }
    }

    public void study() {
        synchronized (studyRoom) {
            log.debug("study 1 小时");
            Sleeper.sleep(1);
        }
    }

}

死锁问题

如果出现一个线程同时获取多把锁的情况,而且不是按照相同的顺序加锁的,可能会出现死锁问题

package cn.itcast.n4.deadlock;

import lombok.extern.slf4j.Slf4j;

import static cn.itcast.n2.util.Sleeper.sleep;

@Slf4j(topic = "c.TestDeadLock")
public class TestDeadLock {
    public static void main(String[] args) {
        test1();
    }

    private static void test1() {
        Object A = new Object();
        Object B = new Object();
        Thread t1 = new Thread(() -> {
            synchronized (A) {
                log.debug("lock A");
                sleep(1);
                synchronized (B) {
                    log.debug("lock B");
                    log.debug("操作...");
                }
            }
        }, "t1");

        Thread t2 = new Thread(() -> {
            synchronized (B) {
                log.debug("lock B");
                sleep(0.5);
                synchronized (A) {
                    log.debug("lock A");
                    log.debug("操作...");
                }
            }
        }, "t2");
        t1.start();
        t2.start();
    }
}

定位

解决

按照相同的顺序加锁

【线程安全】死锁问题及解决方案 本期主要讲解: 1.什么是死锁 2.死锁的三个典型情况 2.1—个线程─把锁 2.2两个线程两把锁 2.3多个线程多把锁 3.如何避免死锁 3.1产生死锁的四个必要条件 3.2打破循环等待 阅读详情

相关推荐

死锁篇:锁顺序死锁问题

文章目录引言什么是锁顺序死锁动态的锁顺序死锁实践启示录 引言 初次接触死锁的概念是大学的一门课程《操作系统原理》中描述的“哲学家进餐”问题。操作系统中,由于各个进程共享系统资源而可能出现死锁问题。同样 Java 多线程环境下,也存在资源共享导致的死锁问题。当一组Java 线程发生死锁时,程序有可能就此阻塞,而无法正常结束。Java 应用程序中,我们使用加锁机制来确保线程的安全,但是如果过度地使用加锁,可能...

本博客纯属个人网络笔记,如对阁下有用,甚喜;否则,关掉即可,不喜勿喷。专心写代码,不做键盘侠! 1079

多个线程多个锁

/** * 线程安全概念:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为, * 那么这个类(对象或方法)就是线程安全的。 * * synchronized:可以在任意对象及方法上加锁,而加锁的这段代码称为“互斥区”或“临界区” * * 当多个线程访问myThread的run方法时,以排队的方式进行处理 * (这里排队是按照cpu分配的先后顺序而定的),一个...

jz1993的博客 292

基于VH6501的Busoff测试

摘要: 本文介绍使用VH6501和CANoe工具测试ECU的Busoff Recovery机制。通过干扰报文触发Busoff状态,验证快恢复(连续32次,间隔100ms)和慢恢复(间隔1000ms)的时序及次数是否符合要求。测试步骤包括硬件配置、干扰参数设置及Trace窗口错误帧分析,最终通过错误帧间隔判定恢复机制的正确性。

酒酿丸子的博客 1039

【多线程学习八】多把锁的情况与锁的活跃性

什么是多把锁以及锁的活跃性有哪些

Jennifer29的博客 295

AI市场风起云涌,ai浏览器是最佳的落地项目,现在ai市场的ai浏览器竞争加剧,得ai浏览器者得天下!

从场景覆盖度来看,AI 浏览器已突破 “网页浏览” 的传统边界,成为连接个人生活、工作、消费的 “超级入口”,这是其他 AI 应用难以比拟的落地优势。在个人生活场景,AI 浏览器可基于用户行为数据主动提供服务 —— 当用户浏览马拉松赛事信息时,浏览器能自动生成 “训练计划 + 装备推荐 + 能量补给方案”,并关联预订链接;在工作场景,Opera Neon 浏览器已实现 “网页内容提取 - 代码生成 - 报告撰写” 的全流程辅助,开发者可直接在浏览器内完成网站开发初稿;

zhang9880000的博客 1086

LLC变压器,常见的4大问题解决方案

其中之一是当付边的绕组的匝数或层数较多的时候,层间或匝间寄生电容和付边的漏感发生一个寄生的振荡,轻载的时候,这个振铃的幅度会达到很高,导致输出电压比设计的要高许多。但当输入是低压的时候,开关频率比较低,LLC谐振回路的增益较大,因而比较容易发生变压器饱和的问题。由于LLC变压器工作在LC谐振状态,LC谐振回路有个特点就是Q值问题,在这里Q值是大于1的,因而就会有实际加在变压器上的电压要比输入电压高的问题,因而在设计变压器的时候就必须考虑到这一点,否则变压器就不是工作在你设计的磁感应强度上。

1265

多线程学习二十二:多把锁

多把锁 一间大屋子有两个功能:睡觉、学习,互不相干。现在小南要学习,小女要睡觉,但如果只用一间屋子(一个对象锁)的话,那么并发度很低. 解决方法是准备多个房间(多个对象锁) @Slf4j(topic = "c.test27:") public class Test27 { public static void main(String[] args) { BigRoom bigRoom = new BigRoom(); new Thread(() -> {

LHBGXX的博客 424

Microsemi Libero系列教程(全网首发)

关于Libero IDE和Libero SoC Libero分为Libero IDE和Libero SoC,Libero IDE最新版本是v9.2 SP3(2016年4月4日)已经不再更新维护了,而Libero SoC是Libero IDE的升级版,官方推荐的开发工具,文中的Libero指的是Libero SoC。 Libero SoC Libero® SoC是Microsemi(美高森美)官方...

whik1194的博客 2万+

多线程基础学习第二篇(多个线程多把锁)

多个线程同时竞争多把锁(这是对象上的锁,因为每个对象都有一把锁,所以彼此之间不存在关系)/** * @version V1.0 * @Description: 多个线程同时竞争多把锁 * 在静态方法上加synchronize关键字,表示锁定.class类,类一级别的锁(独占.class类) * @Modified By:Ming Created in 14:39 2017/3/22 */

u013412790的专栏 589

基于ART算法和SIRT算法的超声CT反演及MATLAB代码实现

在超声CT中,反演算法起着至关重要的作用,它通过从测量数据中恢复出目标物体的内部结构。本文将介绍基于ART算法(Algebraic Reconstruction Technique)和SIRT算法(Simultaneous Iterative Reconstruction Technique)的超声CT反演方法,并提供相应的MATLAB代码实现。本文介绍了基于ART算法和SIRT算法的超声CT反演方法,并提供了相应的MATLAB代码示例。基于ART算法和SIRT算法的超声CT反演及MATLAB代码实现。

2301_79326510的博客 566

YOLOv11改进 | 损失函数改进篇 | MPDIoU、InnerMPDIoU助力细节涨点(二次创新 + 代码解析)

本文为读者详细介绍了YOLOv11模型的最新改进,带来的改进机制是最新的损失函数MPDIoU和融合了最新的Inner思想的InnerMPDIoU(效果打爆之前的所有的损失函数提升检测精度和处理细节方面的作用。通过深入探讨MPDIoU和InnerMPDIoU(全网首发)的工作原理和实际代码实现,本文旨在指导读者如何将这些先进的损失函数技术应用到YOLOv11模型中,以提高其性能和准确性。文章内容涵盖从理论基础、代码实现,到实际教你如何添加本文的机制到你的模型中。

Snu77的博客 4025

【无标题】线程学习(18)-多把锁下的线程问题,死锁,活锁,饥饿

多把锁的应用 减小锁粒度,提交并发度。 package com.bo.threadstudy.four; import lombok.extern.slf4j.Slf4j; /** * 多把锁的情况,以及后期的死锁,活锁,饥饿现象,哲学家就餐 */ @Slf4j public class ManyLockTest { private static final Object lock1 = new Object(); private static final Object l

key_wu的博客 213

4、分布式发电系统中用于改善电能质量的有源、无源和混合滤波器

本文探讨了分布式发电系统中,尤其是光伏(PV)系统运行过程中引入的电能质量问题,并分析了有源滤波器、无源滤波器及混合滤波器在改善电能质量方面的应用。文章详细介绍了光伏系统的建模、最大功率点跟踪(MPPT)技术,以及谐波、电压波动等技术问题,同时对各类滤波器的拓扑结构和控制方法进行了系统性总结。通过仿真实例比较了不同滤波器在减少谐波方面的效果,为实际工程应用提供了参考依据。

transformer2023的博客 89

多线程——线程安全死锁问题

本文主要介绍Java多线程中的死锁问题。1)Java的可重入锁特性允许同一线程对同一锁多次加锁而不会死锁;2)两个线程两把锁;3)多个线程多把锁。文章还分析了死锁的四个必要条件:互斥、不可抢占、请求保持和循环等待。

2301_76937176的博客 1074

华为od 面试八股文_C语言_01_含答案

华为od 面试八股文_C语言_01_含答案

MISAYAONE的博客 3225

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

JavaEE之多线程编程:5. 死锁(详解!!!)

张三李四两人去吃饺子,吃饺子需要酱油和醋。 张三抄起了酱油瓶, 李四抄起了醋瓶。 张三:你先把醋瓶给我,我用完了就把酱油瓶给你。 李四:你先把酱油瓶给我,我用完了就把醋瓶给你。 如果这俩人彼此之间互不相让,就构成了死锁。 酱油和醋相当于是两把锁,这两个人就是两个线程。

T2283380276的博客 1333

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java 死锁 活锁_Java线程的死锁和活锁

1、概览当多线程帮助我们提高应用性能的同时,它同时也带来一些问题,本文我们将借助几个小例子看下两个问题,死锁和活锁。2、死锁2.1、什么是死锁死锁发生在当两个或多个线程一直在等待另一个线程持有的锁或资源的时候。这会导致一个程序可能会被拖垮或者直接挂掉,因为线程们都不能继续工作了。经典的哲学家进餐问题非常好的展示了多线程下的同步问题并且经常被用来当作死锁的例子。2.2 死锁举例首先,我们看一个简单的...

weixin_42348021的博客 230

lwip-2.0.3

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

多把锁+ReentrantLock+活锁+死锁

多把锁 并发度: 同一个时间节点上,可能与服务端进行交互的用户个数; 如何增强并发度: 首先明确,并发度增强无非就是交互个数在一个时间点上变多——>那么我们可以设置多把锁。目的就是同一时间上交互变多; 例子: package com.example.juc.Multi; import lombok.extern.slf4j.Slf4j; /** * @author diao 2022/4/10 */ @Slf4j(topic = "c.TestMultiLock") publ.

weixin_57128596的博客 1082

java 线程死锁问题_Java多线程中的死锁问题

Java程序基本都要涉及到多线程,而在多线程环境中不可避免的要遇到线程死锁的问题。Java不像数据库那么能够检测到死锁,然后进行处理,Java中的死锁问题,只能通过程序员自己写代码时避免引入死锁的可能性来解决。1. Java中导致死锁的原因Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得锁L1,因为默认的锁申请操作都是阻塞的,所以线程T...

weixin_35816287的博客 243

Park & Unpark、线程状态转换、死锁、活锁、饥饿

文章目录1.Park & Unpark1.1 介绍1.2 与 Object 的 wait & notify相比1.3 Park & Unpark 原理2.线程状态转换3.多把锁3.1 多把不相干的锁3.2 死锁3.3 定位死锁3.4 死锁举例 - 哲学家就餐问题 1.Park & Unpark 1.1 介绍 // 暂停当前线程 LockSupport.park(); // 恢复某个线程的运行 LockSupport.unpark(暂停线程对象); 先park()再unpar

张大安的博客 915

【智能解析多线程:线程安全与死锁的深度剖析】

但是如果有N层锁,如何判定这个 } 是最外层的 } ,JVM如何识别?解决方案⚠️:“引用计数器”:在锁对象里面维护一个计数器(int n):每次遇到 { ,n 就 ++ (只有第一次才真正加锁)每次遇到 } , n 就-- (当 n 减到0了,才真正解锁)也就是说里层加锁是虚而不实的,一般来说,只需要在外层加锁即可。【之所以要在里层加锁,是为了防止出现死锁,这种机制叫 “可重入锁”】

“路漫漫其修远兮,吾将上下求索。” 1232

线程安全】死锁问题及解决方案

比如上一次讲到 synchronized 的时候,一个线程,对同一个对象连续加锁两次,如果出现阻塞等待,代表这个锁是不可重入锁,这样的线程,也就称为死锁!一旦程序进入死锁了就会导致线程僵住了,无法继续执行后续的工作了,程序也就出现了严重的 BUG!而死锁这样的情况是很隐蔽的,在开发阶段,不经意间就可能出现死锁的状态!

随风飘雁 280

现代C++多线程基础 - 避免死锁

本文介绍了现代C++中std::mutex的良好使用习惯,多为笔者工作学习中的经验之谈,存在不严谨的地方欢迎讨论。

weixin_41733034的博客 834

【多线程进阶】死锁的成因和解决方案

在Java中,死锁是指两个或多个线程相互等待对方已持有的锁,导致所有线程都被阻塞,无法继续执行的情况。死锁是多线程程序常见的问题之一,如果程序中存在死锁,会导致系统性能下降,甚至崩溃。

书生-w的博客 2万+

04.065-多把锁、死锁、看日志定位排查死锁、

一把锁:所有线程排队争夺同一把锁,容易导致锁竞争和线程阻塞,性能受到严重影响,特别是在高并发场景下。两把锁:通过将任务拆分成不互相冲突的部分,线程可以并发访问不同的资源,从而减少排队次数和锁竞争,显著提高系统的并发性能。单把锁简单,但在高并发场景下可能导致线程排队、锁竞争和性能瓶颈。多把锁能有效减少锁竞争,提高并发性,最大化 CPU 利用率,尤其适用于多个资源或操作不互相依赖的场景。多把锁带来更多的复杂性,如死锁、锁粒度的选择等,因此在设计时需要仔细考虑。优化锁的粒度和合理拆分资源。

qq_41577703的博客 854

C++编程:避免因编译优化引发的多线程死锁问题

在多线程编程中,嵌套锁通常不会导致问题,但在某些情况下(例如使用高级编译优化 `-O3` 或代码执行多次时),编译器优化可能会改变原本稳定的执行顺序,从而引发死锁。实际上,死锁的根本原因通常是程序中 **锁获取顺序的不一致** 和 **内存操作顺序问题**,而并非优化本身所导致的。本文将探讨如何通过编译器优化(如 `-O3`)导致的内存顺序变化,引发死锁的潜在风险,并提供相应的解决方案。

Where there is life, there is hope. 1059
上一篇: 变量的线程安全分析
下一篇: ReentrantLock
Learning_foolish
博客等级 码龄9年 14粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值