如何实现一个程序快速发生死锁

遇到一个问题,如何快速发生死锁,特意总结一下。

1、死锁的定义

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

2、死锁产生条件

互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。

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

不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。

环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。

3、死锁的例子:

public class DeadLockDemo {
    public static void main(String[] args) {
        final Object o1 = new Object();
        final Object o2 = new Object();
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (o1){
                    //获取o1的锁
                    try{
                        Thread.sleep(1000);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                    synchronized (o2){
                        //尝试获取02的锁
                    }
                }
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (o2){
                    //获取o2的锁
                    try{
                        Thread.sleep(1000);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                    synchronized (o1){
                        //尝试获取01的锁
                    }
                }
            }
        });

        //启动两个线程
        t1.start();
        t2.start();
    }
}

4、死锁分析:
Linux用jps命令找出运行的进程pid:(例子运行的程序名称为DeadLockDemo,即pid 为9345)

然后采用jstack (jstack pid)命令显示当前jvm的dump信息:

信息最后我们可以清晰看到(发生了死锁,和对象地址):

详细信息为:

Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x00007f6f50004e28 (object 0x000000058015fa18, a java.lang.Object),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x00007f6f500062c8 (object 0x000000058015fa28, a java.lang.Object),
  which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
    at DeadLockDemo$2.run(DeadLockDemo.java:35)
    - waiting to lock <0x000000058015fa18> (a java.lang.Object)
    - locked <0x000000058015fa28> (a java.lang.Object)
    at java.lang.Thread.run(Thread.java:745)
"Thread-0":
    at DeadLockDemo$1.run(DeadLockDemo.java:18)
    - waiting to lock <0x000000058015fa28> (a java.lang.Object)
    - locked <0x000000058015fa18> (a java.lang.Object)
    at java.lang.Thread.run(Thread.java:745)

Found 1 deadlock.

原文地址:https://www.cnblogs.com/lihao7/p/10268070.html

时间: 2024-10-08 06:53:57

如何实现一个程序快速发生死锁的相关文章

VS2013 C# 调用 cognex 的QuickBuild做程序时发生一个错误

今天在用 VS2013 C# 调用 cognex 的QuickBuild做程序时发生一个错误,如下所示 混合模式程序集是针对"v2.0.50727"版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集 网上搜索得到解决办法: 在app.config中添加一个配置节:startup <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime

一个程序员如何快速赚到一百万?(转)

一个程序员如何快速赚到一百万,说的详细点儿就是: 一个固定工作者怎么跳出固有的模式,靠其他途径(投资.理财.生意.创意.外包等)赚得相对殷实的钞票? 80% 人都会问这种赚钱问题,但这种问题却太难回答,因为太难有个可标准化的模式去效仿或借鉴. 这个时代,赚钱不难,赚 100 万也不难,难的是要具备且能勤奋的执行的能够持续创造财富的思想方法:观察事物 - 分析分解事物 - 得出解决方案,且把每一个步骤一步一步"写"下来并踏踏实实实施,这个方法最笨,但是她是最踏实的,有了这个,钱是迟早的事

c语言:日本某地发生了一件谋杀案,写一个程序来确定到底谁是凶手。

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个.以下为4个嫌疑犯的供词. A说:不是我. B说:是C. C说:是D. D说:C在胡说 已知3个人说了真话,1个人说的是假话. 现在请根据这些信息,写一个程序来确定到底谁是凶手. 程序: #include<stdio.h> int main() { int killer=0; for (killer = 'A'; killer <= 'D'; killer++) { if ((killer != 'A') + (kil

一个程序员如何快速赚到一百万?

一个程序员如何快速赚到一百万,说的详细点儿就是: 一个固定工作者怎么跳出固有的模式,靠其他途径(投资.理财.生意.创意.外包等)赚得相对殷实的钞票? 80% 人都会问这种赚钱问题,但这种问题却太难回答,因为太难有个可标准化的模式去效仿或借鉴. 这个时代,赚钱不难,赚 100 万也不难,难的是要具备且能勤奋的执行的能够持续创造财富的思想方法:观察事物 - 分析分解事物 - 得出解决方案,且把每一个步骤一步一步"写"下来并踏踏实实实施,这个方法最笨,但是她是最踏实的,有了这个,钱是迟早的事

如何快速找到某一个程序占用的端口号?-软件测试

上一节,我们讲过,IP与端口之前的关系.以及目前我们学的软件的端口号.(这可是面试题)那今天来聊聊,如何快速找到某一个程序占用的端口号?例子:fiddle:环境:windows1:运行fiddle2:运行后打开:任务管理器3:找到对应程序的进程.对应的PIDPs:如果没有PID一列,需要进行设置:如下点击查看-->选择列-->勾选PID 4:打开cmd,输入:netstat -ano | findstr 6900 注:从上图可以得知,PID:6900:那么对应的端口号:8888所以:fiddl

习惯看新闻头条 一个程序员分享的工作心得

原本想找链接的.可是...我还是选择手打    原作者:刘鹏看未来 原文标题 10+程序员总结的20+条经验教训 开发 1.从小事做起,然后再扩展 无论是创建一个新的系统,还是添加功能到现有的系统中,我总是从一个简单到几乎任何所需功能的版本启动,然后再一步一步地解决问题,知道满意为止.我从来没有妄想过能够一步登天.相反,我一边开发,一边学习,同时新掌握的信息可以用于解决方案中.我很喜欢John Gall的这句话:"复杂系统总是源于简单系统的演化." 2.一次只改变一件事 当我们在开发时

(小说)那些年,那些事——一个程序员的奋斗史

转自:http://blog.csdn.net/x283930450/article/details/9072223 第01章    段伏枥,一个瘦小,矮小,根本和“帅”这个字粘不上任何关系的普通人 .名字的来源在于其多读了几年书的老爹,总抱着有一天要出书出名乃至于名流千古的 美好理想,但可惜现实总是给予他无情的而又现实的打击,于是就将理想寄望于自己的 儿子,起了个“伏枥”的名,寓意为“老骥伏枥,志在千里”,表达自己不到黄河不死 心的良好的愿望.     只可惜段伏枥这家伙完美地遗传了来自于老爹

事务(进程 ID )与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务

其实所有的死锁最深层的原因就是一个:资源竞争 表现一:    一个用户A 访问表A(锁住了表A),然后又访问表B    另一个用户B 访问表B(锁住了表B),然后企图访问表A 这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了    同样用户B要等用户A释放表A才能继续这就死锁了解决方法:    这种死锁是由于你的程序的BUG产生的,除了调整你的程序的逻辑别无他法    仔细分析你程序的逻辑,    1:尽量避免同时锁定两个资源    2:

一个 Linux 上分析死锁的简单方法

转自:https://www.ibm.com/developerworks/cn/linux/l-cn-deadlock/ 简介 死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程). 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程(线程)在无外力协助下,永远分配不到必需的资源而无法继续运行,