线程死锁(文学家与艺术家例子) 比眉伴天荒 2022-11-01 15:49 158阅读 0赞 ### 文章目录 ### * 前言 * 一、死锁产生的原因 * 二、死锁示例 * 三、死锁代码演示 * 总结 # 前言 # 多线程的学习还是很有意思的,简绍一下在多线程中比较有名的**死锁**产生的原因,这也是面试比较爱问的Java基础之一,所以比较重要,特地挑出来简绍一下下 # 一、死锁产生的原因 # 在多线程中使用锁会造成整个程序的效率降低,但是如果出现同步嵌套,就容易产生死锁问题。而死锁就是两个或者两个以上的线程在执行的过程中,因为争夺资源产生的一种互相等待的现象。 如果两个或者多个共享对象,分别持有对方所需的共享的锁,在试图获取对方线程所持有本线程的锁的时候,就容易出现死锁。 # 二、死锁示例 # 做一个比较有意思的例子 艺术家和文学家都需要最基本的吃饭家伙纸和笔,但是艺术家先拿到纸,作家先拿到笔,此时,两者都不愿意率先放弃手中的资源,还希望拿到对方的资源,这就会出现线程的死锁 # 三、死锁代码演示 # 代码如下(笔类): public class Pen { } 代码如下(纸类): public class Paper { } 代码如下(资源类): public class Resource { private Pen pen; private Paper paper; public Resource() { super(); // TODO Auto-generated constructor stub } public Resource(Pen pen, Paper paper) { super(); this.pen = pen; this.paper = paper; } public Pen getPen() { return pen; } public void setPen(Pen pen) { this.pen = pen; } public Paper getPaper() { return paper; } public void setPaper(Paper paper) { this.paper = paper; } } 代码如下(艺术家线程): public class Artist extends Thread { // 继承 private Resource resource; // 创建对象 public void prepace(Resource resource) { this.resource = resource; } @Override public void run() { // 重写run()函数 Paper paper = resource.getPaper(); synchronized (paper) { // 建立锁 System.out.println("艺术家获得纸"); Pen pen = resource.getPen(); synchronized (pen) { // 建立锁 System.out.println("艺术家获得笔"); } } } } 代码如下(文学家线程): public class Litterateur extends Thread { // 继承 private Resource resource; // 创建对象 public void prepace(Resource resource) { this.resource = resource; } @Override public void run() { // 重写run()函数 Pen pen = resource.getPen(); synchronized (pen) { // 建立锁 System.out.println("文学家获得笔"); try { Thread.sleep(1000 * 1); // 休眠1秒 } catch (InterruptedException e) { e.printStackTrace(); } Paper paper = resource.getPaper(); synchronized (paper) { // 建立锁 System.out.println("文学家获得纸"); } } } } 代码如下(测试): public class Test01 { public static void main(String[] args) { // 创建纸、笔、资源 Pen pen = new Pen(); Paper paper = new Paper(); Resource resource = new Resource(pen, paper); // 创建文学家 Litterateur litterateur = new Litterateur(); litterateur.prepace(resource); // 创建艺术家 Artist artist = new Artist(); artist.prepace(resource); // 启动文学家线程 litterateur.start(); // 启动艺术家线程 artist.start(); } } 代码如下(输出): 艺术家获得纸 文学家获得笔 # 总结 # 运行结果如下 ![在这里插入图片描述][20210224201841193.PNG_pic_center] 在这里面可以看到红圈里面的方块还是红色的,只能说明程序一直在运行,艺术家线程和文学家线程还一直在争夺对方手里的笔或者纸,这就形成了线程的死锁。 [20210224201841193.PNG_pic_center]: /images/20221024/5af50a2da5c2472c8835b937d78cff90.png
相关 线程死锁(文学家与艺术家例子) 文章目录 前言 一、死锁产生的原因 二、死锁示例 三、死锁代码演示 总结 前言 多线程的学习还是很有意思的,简绍一下在多线程中比较有 比眉伴天荒/ 2022年11月01日 15:49/ 0 赞/ 159 阅读
相关 线程死锁 线程死锁是多线程中最头疼的问题,一旦进入线程死锁,很多时候只能通过外部进程重启才能解决问题 线程到达死锁的四个条件: 互斥条件:一个资源每次只能被一个线程使用 资源独占条 港控/mmm°/ 2022年08月21日 14:43/ 0 赞/ 232 阅读
相关 Java线程死锁的简单例子 / DeadLockDemo @author panjn @date 2017/4/1 / public class DeadLockDemo { 阳光穿透心脏的1/2处/ 2022年06月18日 08:45/ 0 赞/ 229 阅读
相关 线程死锁 一、死锁概念 线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代码块时,便 一时失言乱红尘/ 2022年06月14日 09:12/ 0 赞/ 286 阅读
相关 线程死锁 简述: 星期一,新的的一周开始,天气晴朗,风和日丽。本是一个非常不错的心情,突然微信头像闪烁,果不其然又爬虫出问题了,可谓是一入爬虫深似海,项目稳定才见鬼。 墨蓝/ 2022年06月08日 06:30/ 0 赞/ 288 阅读
相关 线程死锁 虽然同步锁机制解决了线程安全问题,但是也带来一些弊端: 1. 效率会降低,每次都需要判断锁的状态 2. 可能引发死锁(彼此占用所需要的资源),出现的概率非常小, 叁歲伎倆/ 2022年05月08日 02:38/ 0 赞/ 273 阅读
相关 线程死锁 先简单用生活列子介绍死锁, 2个人一起吃饭但是只有一双筷子,2人轮流吃(同时拥有2只筷子才能吃)。某一个时候,一个拿了左筷子,一人拿了右筷子,2个人都 ╰半夏微凉°/ 2022年04月08日 13:00/ 0 赞/ 307 阅读
相关 多线程与死锁 多线程与死锁 动态顺序锁死锁 Jconsole 查看死锁 固定锁顺序避免死锁 协作锁之间发生死锁 开放调用避免死锁 RetreenLo 超、凢脫俗/ 2022年02月03日 11:23/ 0 赞/ 418 阅读
相关 线程锁例子 Thread1类 package com.maipiao2; public class Thread1 extends Thread { 我会带着你远行/ 2021年12月23日 16:21/ 0 赞/ 238 阅读
相关 线程死锁 ![20190811092629898.png][] package com.vince; / 多线程要进行资源的共享,就需要同步,但同步过多,就 ゞ 浴缸里的玫瑰/ 2021年10月18日 09:36/ 0 赞/ 465 阅读
还没有评论,来说两句吧...