JAVA手写一个多线程死锁

java多线程模拟死锁(代码) 死锁是在多线程情况下最严重的问题,在多线程对公共资源(文件,数据)等进行操作时,彼此不释放自己的资源,而去试图操作其他线程的资源,而形成的交叉引用,就会产生死锁。 假如我有一个需求,有一个线程,先写入A文件,在顺序写入B文件,再保存起来。还有另一个线程,先写入B文件,再顺序写入A文件,再保存起来。代码如下: private static String fileA = "A文件"; ... 阅读详情

大家都知道多线程并发的时候,我们一般会用到锁。但是锁用不好,就会导致死锁。那么,死锁是如何产生的呢?

一般造成死锁必须同时满足如下4个条件:

  1. 互斥条件:线程使用的资源必须至少有一个是不能共享的。
  2. 请求与保持条件:至少有一个线程必须持有一个资源并且正在等待获取一个当前被其他线程持有的资源。
  3. 非剥夺条件:分配的资源不能从相应的线程中被强制剥夺。
  4. 循环等待条件:第一个线程等待其他线程,后者又在等待第一个线程。

接下来我们来看一段手写的死锁代码

package com.sync;

/**
 * 手写一个死锁
 *
 * @author 小辉GE/小辉哥
 * <p>
 * 2019年8月10日 下午18:30:00
 */
public class DeadLock {
    public static void main(String[] args) {
        Object obj1 = new Object();
        Object obj2 = new Object();
        Runner r1 = new Runner(obj1, obj2, 5000);
        Runner r2 = new Runner(obj2, obj1, 5000);
        new Thread(r1, "r1").start();
        new Thread(r2, "r2").start();
    }
}

class Runner implements Runnable {
    private Object o1;
    private Object o2;
    private int sleepTime;

    public Runner(Object o1, Object o2, int sleepTime) {
        this.o1 = o1;
        this.o2 = o2;
        this.sleepTime = sleepTime;
    }

    public void run() {
        System.out.println("当前线程" + Thread.currentThread().getName() + "获得锁");
        synchronized (o1) {
            try {
                //  这里主要是放大效果
                Thread.sleep(sleepTime);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (o2) {
                System.out.println();
            }
        }
    }
}

测试输出结果如下:

结果分析:

其实我们不难看出,线r1启动时候先获得obj1对象锁且需要获得obj2对象锁,线程r2启动时先获得obj2对象锁且需要获取obj1对象锁,这就同时满足了死锁的条件,也就出现了死锁。

以上代码仅供参考,如有不当之处,欢迎指出!!!

更多干货,欢迎大家关注和联系我。期待和大家一起更好的交流、探讨技术!!!

 

 

一个java线程池死锁的例子 线程池里的线程等待等待队列里的线程执行,等待队列里的等待线程池里的完成,相互等待 立即下载

相关推荐

电影台词预测类型:NLP小样本多标签分类实战

电影类型预测本质上是短文本语义建模问题,核心在于从高度碎片化、低语义密度的台词(平均仅12.7词)中挖掘隐含的类型学编码规则。其技术难点在于:需应对省略主语、倒装、拟声词等非规范表达;处理Drama与Comedy等类型强共现的多标签耦合;并克服领域迁移障碍——维基文本预训练模型在台词上性能骤降0.11。解决方案聚焦RoBERTa微调、类型感知注意力机制与标签平滑策略,兼顾小样本鲁棒性与业务可解释性,广泛适用于影视元数据标注、智能推荐系统及NLP教学实践。

weixin_33309048的博客 287

java中的线程死锁问题

不可重入是指,对一个线程对一个对象加锁之后,在释放锁之前,又想对这个对象进行加锁,但是此时这个对象已经有锁了,就会陷入等待这个锁释放,但是第一个锁本身就是被线程本身加锁的,线程陷入了死锁,这个锁的特性就被称为不可重入锁,java的synchronized是可重入锁,不会出现这个问题。还是线程甲乙和锁ab,将锁a编号为1,锁b编号为2,此时甲乙都想申请锁a和b,他们需要现申请a,在申请b,只要甲线程申请到a,那b也只能被甲线程申请,因为乙必须先申请到a,才能申请b,而a已经被甲申请了,乙只能等待。

qq_61925446的博客 161

stm32 + freertos + c++混合编程方法

其他一些资料上面,c++配置成--cpp11或者-cpp 都是把工程配置成c++。三、添加cpp文件,我们调用cpp文件里面的接口函数,不需要修改main.c后缀名。2、配置工程编译时候是--c99,是因为工程里面FreeRTOS是c语言,c++模式会报错。我们这里是默认c,编写的c++文件,单独选择--cpp编译,这在后面配置!c++是面向对象编程,对于一些项目来说,c++编程更加合适!stm32cubemax配置,这里就不写了,配置资料比较多。这里就是让cpp文件在c++下编译。最后,编程成功,点亮!

yuhu0012的博客 2629

关于对死锁的理解

举例说明:程序员A需要修改代码才能展示出正确的二位码,保安B需要正确的二位码才能让A进去修改,A占有的技术(资源)等待B持有的权利(资源)释放,而B占有的权利(资源)等待A的技术(资源)修改,二者僵持不下,如果将A和B看做是线程,则二者都不能执行,若不采取其它措施,这种循环等待状况会无限期持续下去,就发生了进程死锁。不可重入:所谓非可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞,是产生死锁的一种原因.我们只需要改变线程的环路访问就可以解决。

weixin_46629998的博客 211

用Python实现图片风格迁移,让你的图片更加的高逼格!

先来看下效果: 上图是老王在甘南合作的米拉日巴佛阁外面拍下的一张照片,采用风格迁移技术后的效果为: 一些其它效果图: 下面进入正题。 近年来,由深度学习所引领的人工智能(AI)技术浪潮,开始越来越广泛地应用到生活各个领域。这其中,人工智能与艺术的交叉碰撞,在相关技术领域和艺术领域引起了高度关注。就在上个月,由电脑生成的艺术品在佳士得(Christie’s)的拍卖价竟高达43.25万美元,...

Python追梦 6181

AI 学术科研与论文写作的正确打开方式!不套提示词模板,靠这个思路完美实现人机共创

真正的“人机共创”,也就是AI引导我思考的过程,如果你想用你的模糊需求,去写出专业化的学术内容,那是不可能的。对想快速完成某些学术任务的同仁来说,我们完全不用去抠提示词的细节,直接用魔法打败魔法,设计一段优化提示词的结构化提示词(提示词架构),辅助优化你的模糊需求。创建好之后,可以对它提你的任何模糊学术需求,比如写论文、写综述、学术润色等等,它绝不会直接帮你生成,而是先搞懂你的真实意图。以上整个流程,完全没有一句废话,先是思考,再是向你提问弄懂你的意图,最后整合你给出的关键信息,直接优化你给的模糊需求。

智能AI让学术科研更容易 477

Java多线程基础-13:一文阐明死锁的成因及解决方案

死锁的几种情况,产生的四个必要条件以及解决措施。

wyd_333的博客 1812

Sigrity Power DC Single-BoardPackage IR Drop Analysis模式进行单板压降仿真分析操作指导

如果需要单独对某个via设置参数,右侧选择Setup by padstack,下方下拉选择某个via,单独设置参数即可。举例:板厚1.6mm,内层1OZ(1.2mil,即0.03mm),铜皮宽度1mm,20度温升,允许通流I为2.5A。目的是模拟实际情况,via的孔壁电镀1mil,中间是空心的,让via不完全被填充金属成为实心via。Upper/lower Tolerance:上下公差,设置为5%,也就是压降允许的范围。电流密度计算公式:J=I/A(J为电流密度,I为电流,A为横截面积)

weixin_54787054的博客 695

【手写线程池实现】

改为:Runnable poll = workQueue.take();// take()若队列为空,则阻塞线程,直到获取到元素*将:Runnable poll = workQueue.poll();这段代码非常损耗性能,不管队列有没有任务都会一直循环运行。

祁_z 623

SAP FICO CBS接口-银企直连付款平台功能开发说明书(包括测试样例、FS)

SAP FICO CBS接口-银企直连付款平台功能开发说明书(包括测试样例、FS)

我好像病了的博客 2447

dex2oat编译优化调试

dex2oat编译调试的一些技巧和方法

jidapenglin28的专栏 5044

Java 线程死锁及如何避免死锁介绍

死锁是指两个或两个以上的线程在执行过程中,**因争夺资源而造成的互相等待**的现象,在无外力作用的情况下,这些线程会一直相互等待而无法继续运行下去,

weixin_46448719的博客 4823

lwip-2.0.3

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

Java多线程之死锁(死锁产生条件、手写简单死锁程序、破坏死锁)(面试常有)

本篇博客主要学习和讨论的内容是:Java中小型面试经常出现的"死锁"、"死锁产生的四个必要条件"、"手写简单死锁程序"、"如何破坏死锁"等相关问题。里面详细的解读了实际生活"死锁"情形、程序"死锁"情形,并提到了如何解决该类"死锁"问题...

岁岁岁平安的博客 1896

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java多线程-手写一个死锁的例子

Java多线程-手写一个死锁的例子 下面是一个多线程死锁的例子 public class DeadLockDemo { private static Object lock1 = new Object(); private static Object lock2 = new Object(); public static void main(String[] args)...

qq_24095055的博客 2403

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

一个多线程死锁案例,如何避免及解决死锁问题?

多线程死锁在java程序员笔试的时候时有遇见,死锁概念在之前的文章有介绍,大家应该也都明白它的概念,不清楚的去翻看历史文章吧。 下面是一个多线程死锁的例子 输出 thread1 get lock1 thread2 get lock2 两个线程相互得到锁1,锁2,然后线程1等待线程2释放锁2,线程2等待线程1释放锁1,两者各不相互,这样形成死锁。 那么如何避免和解决死锁问题呢? 1、按顺序加锁 ...

Java技术栈,分享最主流的Java技术 1388

死锁-java线程死锁

死锁是计算机系统中一个常见的问题,它指的是两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

qq_34358193的博客 1581

Java线程死锁问题怎么排查

监控与初步判断:通过监控工具观察线程状态和系统响应情况;采集线程 dump:使用 jstack 或其他工具生成线程转储;分析线程转储:利用死锁检测信息、调用栈和专用工具定位死锁原因;代码和设计审查:检查并发代码的锁使用和同步逻辑,确保锁的顺序一致;预防与监控:采用程序检测、定期采集线程 dump 和报警机制预防死锁的发生。通过系统化的排查流程,结合工具分析和代码优化,可以有效定位和解决 Java 线程死锁问题。

longgelaile的博客 1324

【Java并发】线程死锁

线程死锁,指的是两个或多个线程因争夺资源而互相等待,形成了一个无限循环,导致所有相关线程都无法继续执行的状态。死锁条件含义解决方式示例互斥条件资源不可共享使用读写锁、信号量请求与保持条件一边占有一边请求一次性申请全部资源不可剥夺条件不主动释放资源失败时释放已有资源循环等待条件构成资源环等待链统一加锁顺序,破坏循环死锁发生必须满足互斥、请求与保持、不可剥夺、循环等待四个条件。我们可以通过统一加锁顺序、一次性获取所有资源、使用 tryLock() 限时获取锁。

m0_47352999的博客 1366

Java线程之如何分析死锁及避免死锁

什么是死锁 java中的死锁是一种编程情况,其中两个或多个线程被永久阻塞,Java死锁情况出现至少两个线程和两个或更多资源。 在这里,我们将写了一个简单的程序,它将导致java死锁场景,然后我们将分析它。 怎么实现死锁 下面我们一起看一个简单的死锁事例,在主线程中每隔5秒钟启动一个线程,每个线程的执行时间是3秒钟 package com.lkf.mulithread; ...

码客 1万+

「多线程锁」手写死锁案例及排查死锁原因

死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去,如果资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。...

frozenpenguin的博客 1903

手写Java死锁

首先创建两个锁对象,然后两个线程各自先获取一个锁,然后互相再获取对方已经获取到的锁,此时就会出现死锁。 public class DeadLock{ // 创建两个锁对象 private Object o1 = new Object(); private Object o2 = new Object(); public void m1() throws Int...

keep fighting 586

线程死锁详细介绍

死锁是指两个或多个线程互相等待对方占用的资源,而永远无法继续执行下去的情形。更正式的说,死锁是在多线程环境中,多个线程因争夺系统资源而造成的一种互相等待的现象。若无外力干预,这些线程将永远处于等待状态,导致整个程序无法继续运行。

Flying_Fish_roe的博客 2061

手写死锁线程

发生死锁的原因:多个线程已经占有一个资源还要争夺互相之间手中的资源(资源就是指被上锁的内容) 死锁线程代码 package com.wang; import java.util.concurrent.TimeUnit; class holdlock implements Runnable { String lockA; String lockB; ...

weixin_30545285的博客 132
上一篇: JAVA多线程高并发之ReentrantLock讲解公平锁
下一篇: JAVA并发编程Fork/Join(分而治之思想)之(Future/Callable)
饶艳辉
博客等级 码龄15年 20粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值