多线程死锁案例

线程死锁 解决共享资源问题 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。java 死锁产生的四个必要条件:1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。4、循环 阅读详情
public class ThreadDeadlock implements Runnable{
    private  boolean flag;
    public ThreadDeadlock(boolean flag){
        this.flag = flag;
    }
    public void run(){
        if(flag){
            synchronized (LockThread.object1){
                System.out.println(Thread.currentThread().getName()+":object1");
                synchronized (LockThread.object2){
                    System.out.println(Thread.currentThread().getName()+":object2");
                }
            }
        }else {
            synchronized (LockThread.object2){
                System.out.println(Thread.currentThread().getName()+":object2");
                synchronized (LockThread.object1){
                    System.out.println(Thread.currentThread().getName()+":object1");
                }
            }
        }
    }
}

 

public class LockThread {
    public static final Object object1 = new Object();
    public static final Object object2 = new Object();
}

 

//main方法里测试死锁案例
ThreadDeadlock t1 = new ThreadDeadlock(true);
ThreadDeadlock t2 = new ThreadDeadlock(false);
Thread thread1 = new Thread(t1);
Thread thread2 = new Thread(t2);
thread1.start();
thread2.start();

分析原因:当thread1线程拿到 锁1 进入到run方法里执行第一个同步代码块,把第一句打印执行完毕,这个时候cpu切换到执行thread2线程,那thread2线程拿到 锁2 进入到flag为false的第一个同步代码块打印第一句话完毕,执行第二个同步代码块,这个时候 锁1 的锁还没有放开,thread2就无法继续执行,cpu切换到thread1里继续执行发现thread2的 锁2 也没放开也没办法继续执行,所以这个时候就形成了死锁。

java 多线程死锁案例 package test; /** * 内容:创建两个静态对象和两个线程,第一个线程给第一个对象加锁,第二个线程给第二个对象加锁,当第一个线程要获取第二个对象的锁时 * 发现第二个对象的钥匙正在被第二个线程持有,所以第一个线程要的等待第二个线程释放该锁,而第二个线程要释放该锁就有执行该synchronize块, * 所以要去拿第一个对象的锁,而第一个对象的锁,正在被第一个线程占有,于是两个... 阅读详情

相关推荐

删除结点

对给定的单链表 L ,设计一个算法,删除 L 中值为 x 的结点的直接前驱结点。 1 由键盘输入值,换行表示输入结束,根据输入建立单链表。 2 输入链表中的一个元素值,从链表中删除这个元素的前驱结点。 3 对删除元素后的链表元素在屏幕上显示。 测试用例1 11 22 33 44 55 66 77↵ 44↵ 期待输出1 11 22 44 55 66 77↵ #include <iostre...

SChenlyx 1618

多线程——死锁问题

案例实现: public class DeadLockTest implements Runnable { A a = new A(); B b = new B(); public static void main(String[] args) { DeadLockTest test = new DeadLockTest(); //执行run()方法 new Thread(test).start(); //执行in

sssdddadas的博客 150

从零开始:小鼠Bulk RNA-seq全流程实战指南

本文提供了一份详尽的小鼠Bulk RNA-seq全流程实战指南,涵盖从软件环境搭建、原始数据质控与清洗、序列比对、基因定量到下游差异表达分析与功能富集。内容面向生物信息学新手,通过清晰的代码示例和步骤解析,帮助读者系统掌握Bulk RNA-seq数据分析的核心技能,并产出可靠的生物学洞见。

lake5的博客 720

JAVA实现的一个简单的死锁(附解释)

[java] view plain copy public class DeadLockTest implements Runnable{    private int flag;    static Object o1 = new Object(), o2 = new Object();      //静态的对象,被DeadLockTest的所有实例对象所公用 

u012506234的专栏 955

保姆级教程:用YOLOv5s训练PCB缺陷检测模型(附北大公开数据集)

本文提供了一份基于YOLOv5s的PCB缺陷检测模型从零开始的完整实战教程。详细解析了如何使用北大公开数据集,涵盖环境搭建、数据处理、模型训练、性能评估及优化部署全流程,并针对工业场景中常见的类别不均衡问题给出了具体解决方案,旨在帮助开发者快速构建高精度的自动化质检系统。

weixin_28285943的博客 308

10倍开发者的 Dify 魔法书:从零构建全栈 AI 应用

“不懂底层算法,也能开发爆款 AI 应用吗?” 答案是:绝对可以。 Dify 正在重新定义 AI 应用的开发范式——通过可视化的低代码平台,将原本需要数周的开发周期压缩到几小时。无论你是前端、后端、产品经理,还是渴望破局的独立开发者,这都是你不可错过的红利。 我们将手把手教你利用 Dify 快速接入百模大战,零代码搭建企业级知识库,并一键发布你的专属 AI 助手、智能客服和自动化工作流。 告别重复造轮子,掌握 Dify,一个人就是一支 AI 团队。现在上车,开启你的 10 倍速开发之旅!

davidwang456的专栏 685

JAVA_Thread_deadlock

package com.kk.thread;/* * 本类演示死锁的形成 * 基本数据类型是不能作为同步块的参考,例:int b;synchronized(b) */public class TicketsSystem { public static void main(String[] args)throws Exception { SellThread sell=new...

weixin_34168700的博客 207

scratch经典游戏主题源码分享,包含了20多款经典游戏

经典游戏案例:1、360度角度射击游戏 2、捕鱼达人 3、超级马里奥 4、超级玛丽 5、吃豆人相关 6、穿着喷气背包的海龟 7、大鱼吃小鱼 8、俄罗斯方块 9、飞机大战 10、愤怒的小鸟 11、黄金矿工 12、节奏大师 13、连连看 14、迷宫游戏 15、跑酷游戏 16、扫雷 17、水果忍者 18、坦克大战 19、推箱子 20、消除泡泡 21、保卫萝卜 22、植物大战僵尸

IT_Scratch的博客 1万+

Java之多线程(同步、死锁、经典问题)

同步 线程的安全问题 同步代码块 synchronized(临界资源对象){//为临界资源对象加锁 //原子操作 } 注 每个对象都有一个互斥锁标记,用来分配给线程的 只用拥有对象互斥锁标记的线程,才能进入该对象加锁的同步代码块 线程退出同步代码块时,会释放相应的互斥锁标记. 同步方法 synchronized 返回值类型 方法名称(形参列表){//对当前对象(this)加锁 //代码(原子操作) } 注 只有拥有对象互斥锁标记的线程,才能进入该对象加锁的同步方法中 线程退出同步方法是,会释

qq_43336579的博客 1240

RK3568平台开发系列:Android环境下CAN的使用

在RK3568平台上,我们可以利用Android环境中的API来实现CAN的使用。通过以上步骤,我们可以在Android应用中发送和接收CAN数据,并进行相应的处理。当接收到CAN数据时,将触发onMessageReceived回调方法,我们可以在这个方法中对接收到的数据进行处理。在上述代码中,我们指定了CAN的ID为0x123,数据为{0x01, 0x02, 0x03},并设置了标志位和周期。接收CAN数据需要注册一个监听器,并在监听器中处理接收到的数据。发送CAN数据需要指定CAN的ID和数据。

2301_79330513的博客 1913

脑电信号处理实战 01 | 从 0 跑通第一个 EEG 分析:加载、滤波、频谱与“睁眼闭眼“

本文以 UCI 公开数据集"EEG Eye State"为例,从零走通脑电处理的完整流水线——数据加载、1–40 Hz 带通滤波、Welch 功率谱、频带功率、通道相关性与箱线图质控、睁闭眼对比和时频分析,并用 8 张科研风格图层层揭示这份数据中的伪迹与通道重复问题,说明"流程跑得通不等于结果可信,质量控制永远先行"。

qq_53529450的博客 119

java多线程死锁案例(代码案例)

java多线程死锁案例(代码案例) 什么是死锁 当一个线程拥有A对象锁,并等待B对象锁的时候,另一个线程拥有B对象锁,并等待A对象锁,这就造成了死锁。 一个线程可以同时拥有多个对象的锁标记,当线程阻塞时,不会释放已经拥有的锁标记,也可能会造成死锁。 案例介绍: 假如宿舍只剩一双鞋,这时候小明和小朋两个人都要出去,两个人一个拿到了左脚鞋子,一个人拿到了右脚鞋子,可是谁也不让给谁,于是乎就造成了死锁现象,谁也别出去了。 package com.nxw.Thread.dieLock; public clas

Silence-wen 2326

matlab 点云学习目录【2026最新版】

matlab 点云学习目录。博客长期更新,本文最近更新时间为:2026年6月15日。

点云侠的博客 3万+

多线程死锁问题简单案例

多线程案例其实也就是一句话,我获得一个线程资源不释放,又要获得另一个资源, 其他线程也是获得一个不释放,又想获得别的线程。其实最多的就是线程之间的相互调用。 [code="java"]/** * 指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 * * @author Janle * */ publi...

青松 177

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

多线程死锁问题 +案例

多线程死锁问题: 一、什么是死锁和原因? 死锁的四个条件:(互斥、不可剥夺、请求持有、循环等待) 最根本原因是:线程在获得一个锁L1的情况下再去申请另外一个锁L2,也就是锁L1想要包含了锁L2,也就是说在获得了锁L1,并且没有释放锁L1的情况下,又去申请获得锁L2,这个是产生死锁的最根本原因**。另一个原因是**默认的锁申请操作是阻塞的。 二、手写一个java多线程的死锁案例? 案例1:锁定类变量...

fct2001140269的博客 307

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

多线程系列(五)------ 死锁案例以及检测方法

一、简介 在使用多线程的时候最头疼的问题就是死锁了,不好排查。通过该篇文章,你可以了解常见的死锁案例,引起原因,检测死锁的常用方法以及避免死锁的写法的注意事项。 注:本文主要参考博主wolfcode_cn的文章理解Java死锁之死锁检测 以及个人完善。 尊重原创。 二、死锁 2.1 常见引起原因 常见于使用锁嵌套 T...

请叫我猿叔叔的博客 1248

Statistics and Machine Learning Toolbox

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

java多线程死锁死锁案例

/** * 两个线程先分别持有两把锁,然后再去请求对方的锁,导致死锁 */ public class DeadLock extends Thread { private static Object obj1 = new Object(); private static Object obj2 = new Object(); public static void m...

xiaobao5214的博客 300

Java中多线程的死锁现象及演示一个死锁案例

文章目录前言一、什么是死锁二、死锁案例1.引入库2.读入数据总结 前言 Java多线程中死锁是一个重要内容,所以对于死锁的理解非常重要。在面试过程中,经常会让程序员写一个死锁案例。 一、什么是死锁 我们举一个生活中的例子,中国人和外国人一起吃饭,中国人使用筷子外国人使用叉子才能顺利吃完饭。 那么什么是死锁现象呢?就是外国人拿着筷子,中国人拿着叉子,两个人谁都不给谁,那么,就会一直僵持,谁都吃不了饭。 死锁现象出现后,不会出现异常,也不会出现提示,只是所有的线程都会出现阻塞状态,无法继续。 二、死锁案例

悬悬小的博客 660

多线程 05:线程同步,三大不安全案例分析,synchronized 和 Lock 的应用,以及死锁相关知识

本文讲述线程同步相关知识,包括线程同步机制,线程同步涉及的三大不安全案例(不安全买票 / 取款 / 集合),及这些案例的完善方法。同时,通过 synchronized(同步)和 Lock(锁),我们能解决多线程共享资源引起的访问冲突,实现线程同步。此外,文章还介绍了死锁的知识,如死锁产生的条件,死锁的案例,以及如何避免死锁等。

积累,沉淀,温故而知新 1653

Java多线程死锁案例

产生死锁的原因 就是,两个线程互相等待着对象释放锁,一直这样僵持下去,所以导致了死锁的产生,下面这个代码就会产生一个死锁: package com.example.demo.thread; public class DeadLockDemo { private static String A = "A"; private static String B = "B"; p...

墨笙弘一 3234

多线程死锁经典案例,必定会发生死锁

        Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁,从而导致所有的任务都无法继续完成。换言之只要互相等待对方释放锁就有可能出现死锁。下面将用一个简单的例子加以说明,如有问题,请多多指教。        某日AB两位壮士各获一张一模一样的藏宝图,他们相距甚远,互不认识。两位壮士不仅武艺双全,还富有谋略,细读藏宝图,壮士得知宝藏就在某处,但是需要两把钥匙...

言必信,行必果 1018

多线程——死锁案例及衍生

原案例:男孩女孩争夺一双筷子,同时拥有两支筷子才能吃饭。男孩先抢左筷子再抢右筷子,女生先抢右筷子再抢左筷子。若互不相让,则可能产生死锁。故男孩决定若其先有左筷子则礼让等待女孩用完,唤醒男孩,男孩再用。总之让女孩先用。(源代码在最后) 运行结果(之一): 老师给我们这个案例原本是要演示死锁,然后我下课之后多运行了几遍发现…嗯??? 是哦,万一本来两支筷子就都是女孩自己争夺过来的呢,女孩吃完了饭释...

小茶的博客 223

如何确保C++多线程安全?5个真实案例教你零失误避免死锁

掌握C++多线程死锁避免的关键方法,有效提升程序稳定性与并发性能。通过5个真实应用场景解析,涵盖锁顺序、RAII、死锁检测等核心技巧,帮助开发者规避资源竞争问题。实用方案一步到位,值得收藏。

FuncWander的博客 991

JAVA多线程创建、信息共享、管理、消费者与生产者案例、死锁案例等。

一、java多线程创建 1.Thread类 -java.lang.Thread -线程继承Thread类,实现run方法 public class Thread1 extends Thread{ public void run(){} } 2.Runnable接口 -java.lang。Runnable接口 -线程实现Runnable接口,实现run方法 实现Runnable的对象必须包装在Thread类里面,才可以启动 public class Thread2 implements

weixin_55491446的博客 531
上一篇: 单例懒汉式多线程线程安全相关问题及解决
下一篇: 多线程-等待与唤醒
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值