java并发编程04:死锁

mengy      2022-05-12     804

关键词:

1、什么是死锁

多线程以及多进程改善了系统资源的利用率并提高了系统的处理能力。然而,并发执行也带来了新的问题--死锁。

所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。

技术图片

 

 2、死锁产出的必要条件

以下这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

2.1 互斥条件

线程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个线程所占有。若此时其他线程请求该资源,则请求线程只能等待。

2.2 不可剥夺条件

线程所获得的资源在未使用完毕之前,不能被其他线程强行夺走,即只能由获得该资源的线程自己释放(只能是主动释放)。

2.3 请求与保持条件

线程已经保持了至少一个资源,但是又提出了新的资源请求,而该资源已被其他进程占有,此时请求资源被阻塞,但对自己已获得的资源保持不放。

2.4 循环等待条件

存在一种线程资源的循环等待链,链中每一个线程已获得的资源同时被链中下一个线程所请求。即存在一个处于等待状态的线程集合{Pl, P2, …, pn},其中Pi等待的资源被P(i+1)占有(i=0, 1, …, n-1),Pn等待的资源被P0占有,如图所示。

技术图片

java并发编程-一个简单的死锁示例和死锁的检查(代码片段)

  Java线程死锁是一个经典的多线程问题。因为不同的线程都在等待根本不可能被释放的锁,从而导致所有的任务都无法继续完成。1.死锁程序示例创建类DeadLockThread:publicclassDeadLockThreadimplementsRunnableprivateObjectlock1=newObject();priva... 查看详情

并发编程之死锁解析(代码片段)

前言在Java的并发编程中,有一个问题需要特别注意,那就是死锁,如果发生了死锁,基本就是重启,而重启将会丢失运行中的数据。所以,了解死锁的形成并排查死锁到预防死锁成了一个重要的问题。我们了解任何一个事情的... 查看详情

并发编程--锁--如何使用命令行和代码定位死锁

用命令行的方式找到死锁本地环境下,如果程序发生死锁后,首先cmd进入$JAVA_HOME/bin/中,输入jps命令,就可以查看到当前Java程序的pid,找到死锁类的pid后执行jstack命令+空格+死锁类的pid,就可以获取线程获取锁的信息。截取一部... 查看详情

java并发编程的艺术记录

模拟死锁packagecom.gjjun.concurrent;/***模拟死锁,来源于《Java并发编程的艺术》*@Authorgjjun*@Create2018/8/12**/publicclassDeadLockDemo{privatestaticStringA="A";privatestaticStringB="B";publicstaticvoidmain(String[]args){D 查看详情

java并发编程实战读书笔记之死锁(代码片段)

...二、动态的锁顺序死锁。前言本篇学习笔记源自于《Java并发编程实战》第10章。提示:以下是本篇文章正文内容,下面案例可供参考一、锁顺序死锁看下面代码,很容易造成死锁,leftRight和rightLeft方法分别获取了l... 查看详情

java并发编程实战读书笔记之死锁(代码片段)

...二、动态的锁顺序死锁。前言本篇学习笔记源自于《Java并发编程实战》第10章。提示:以下是本篇文章正文内容,下面案例可供参考一、锁顺序死锁看下面代码,很容易造成死锁,leftRight和rightLeft方法分别获取了l... 查看详情

day825.死锁问题-java并发编程实战(代码片段)

...解决银行业务里面的转账问题,虽然这个方案不存在并发问题,但是所有账户的转账操作都是串行的,例如账户A转账户B、账户C转账户D这两个转账操作现实世界里是可以并行的,但是在这个方案里却被串行化了&#x... 查看详情

day825.死锁问题-java并发编程实战(代码片段)

...解决银行业务里面的转账问题,虽然这个方案不存在并发问题,但是所有账户的转账操作都是串行的,例如账户A转账户B、账户C转账户D这两个转账操作现实世界里是可以并行的,但是在这个方案里却被串行化了&#x... 查看详情

(更新中)谈谈个人对java并发编程中(管程模型,死锁,线程生命周期等问题)见解

... 公司的项目开始用到多线程,所以自己谈谈个人对于并发编程的见解。 并发编程会导致线程不安全,常说的线程不安全指的是 多个线程操作一个共享数据,导致线程之间的读取到的数据不一致。并发编程导致线程不... 查看详情

java并发编程系列——死锁的解决(代码片段)

接下来我会以一个经典的转帐问题,跟大家一起聊聊死锁,以及如何解决这个问题。假如客户A需要给客户B转账,客户A的账户减少100元,客户B的账户增加100元。我们转化为代码描述:有一个账户类Account,... 查看详情

java并发编程系列——死锁的解决(代码片段)

接下来我会以一个经典的转帐问题,跟大家一起聊聊死锁,以及如何解决这个问题。假如客户A需要给客户B转账,客户A的账户减少100元,客户B的账户增加100元。我们转化为代码描述:有一个账户类Account,... 查看详情

python并发编程之死锁

前言在并发编程中,死锁指的是一种特定的情况,即无法取得进展,程序被锁定在其当前状态。在大多数情况下,这种现象是由于不同的锁对象(用于线程同步)之间缺乏协调,或者处理不当造成的。在这一节中,我们将讨论一... 查看详情

《java并发编程的艺术》读后笔记-part1(代码片段)

文章目录《Java并发编程的艺术》读后笔记-part1第一章并发编程的挑战1.上下文切换1.1多线程就一定快吗?1.2如何减少上下文切换呢?2.死锁2.1避免死锁的几个方法3.资源限制的挑战《Java并发编程的艺术》读后笔记-part1第一... 查看详情

java并发编程--并发编程线程基础(线程创建与运行线程通知与等待join/sleep/yield方法线程中断线程上下文切换死锁守护线程与用户线程threadlocal)

文章目录1.并发编程线程基础(上篇)1.1线程基础知识1.1.1程序1.2.2进程1.3.3线程1.3.4小结1.2线程创建与运行1.2.1继承Thread类方式的实现1.2.2实现Runnable接口的run方法方式1.2.3使用FutureTask的方式1.3线程通知与等待1.3.1wait(&#... 查看详情

java并发编程--并发编程线程基础(线程创建与运行线程通知与等待join/sleep/yield方法线程中断线程上下文切换死锁守护线程与用户线程threadlocal)(代码片段)

文章目录1.并发编程线程基础(上篇)1.1线程基础知识1.1.1程序1.2.2进程1.3.3线程1.3.4小结1.2线程创建与运行1.2.1继承Thread类方式的实现1.2.2实现Runnable接口的run方法方式1.2.3使用FutureTask的方式1.3线程通知与等待1.3.1wait(&#... 查看详情

原创java并发编程系列04|java内存模型详解(代码片段)

【原创】Java并发编程系列04|Java内存模型详解收录于话题#进阶架构师|并发编程专题12个点击上方“java进阶架构师”,选择右上角“置顶公众号”20大进阶架构专题每日送达思维导图写在前面前面讲解了并发编程的三大核心问题:... 查看详情

python并发编程多线程死锁现象与递归锁(代码片段)

  一死锁现象所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相... 查看详情

高并发编程-05-活跃性问题

死锁,饥饿,活锁1,死锁多个线程,各自占对方的资源,都不愿意释放,从而造成死锁工具:使用jconsole可以检测程序运行的死锁线程2,饥饿多个线程访问同一个同步资源,有些线程总是没有机会得到互斥锁,这种就叫做饥饿... 查看详情