多线程实现死锁(Java实现)

原创 2015年11月18日 10:15:14

       学习Java比较久了,对多线程也比较熟悉,前段时间面试的时候,面试官问我:请你写一段多线程实现死锁的代码。说实话当时有点儿蒙,以前做的都是如何避免死锁,现在要产生死锁,还真没写过,不过回忆一下产生死锁的四大必要条件,要写出这段代码还是不难的。

产生死锁的四个必要条件:

(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

所以只要照着这四个必要条件写,写出死锁程序还是不难的(没代码你说个JB),好,下面是我的代码:

</pre><pre name="code" class="java"><span style="color:#333333;">package com.lai.test;  
  
public class DeadLock {  
    public static void main(String[] args) {  
        Resource r1= new Resource();  
        Resource r2= new Resource();  
        //每个线程都拥有r1,r2两个对象  
        Thread th1 = new Thread1(r1,r2);  
        Thread th2 = new Thread2(r1,r2);  
       th1.start();  
        th2.start();  
    }  
}  
  
class Resource{  
    private int r;  
}  
  
class Thread1 extends Thread{  
    private Resource r1,r2;  
    public Thread1(Resource r1, Resource r2) {  
        this.r1 = r1;  
        this.r2 = r2;  
    }  
  
    @Override  
    public void run() {  
        while(true){  
        //先获得r1的锁,在获得r1锁的情况下,再获得r2的锁     
        synchronized (r1) {  
            System.out.println("1号线程获取了资源r1的锁");  
            synchronized (r2) {  
                System.out.println("1号线程获取了资源r2的锁");  
            }  
        }  
        }  
    }  
      
}  
  
class Thread2 extends Thread{  
    private Resource r1,r2;  
    public Thread2(Resource r1, Resource r2) {  
        this.r1 = r1;  
        this.r2 = r2;  
    }  
  
    @Override  
    public void run() {  
        while(true){  
        //先获得r2的锁,在获得r2锁的情况下,再获得r1的锁  
        synchronized (r2) {  
            System.out.println("2号线程获取了资源r2的锁");  
            synchronized (r1) {  
                System.out.println("2号线程获取了资源r1的锁");  
            }  
        }  
        }  
    }  
      
}  </span>

运行过程中,发现程序停止了,说明发生了死锁!!!OK,拜了个拜!!!!!!

Java多线程之synchronized及死锁编写

java中锁很常见,尤其是在多线程的情况下,我们会经常使用到锁。面试中我们也会经常被问到如何编写一个死锁。 java提供synchronized关键字来提供锁机制,在多线程中为了使程序并行我们会常使用...
  • silk_bar
  • silk_bar
  • 2016年04月03日 19:44
  • 1385

Java多线程 线程同步与死锁

1.线程同步多线程引发的安全问题一个非常经典的案例,银行取钱的问题。假如你有一张银行卡,里面有5000块钱,然后你去银行取款2000块钱。正在你取钱的时候,取款机正要从你的5000余额中减去2000的...
  • kong_gu_you_lan
  • kong_gu_you_lan
  • 2017年02月25日 15:47
  • 840

java面试题----用java代码写死锁(线程join写法)

java面试题----用java代码写死锁 线程join写法 public class Test2 { //join写线程死锁 //join 等待该线程终止,即把对象所在当前的线程停止...
  • bestxianfeng163
  • bestxianfeng163
  • 2017年08月12日 14:15
  • 262

多线程编程(一)——写一个简单的死锁

(整个九月忙着找工作,好多收获,好多遗憾,最终结局还可以接受,技术路还很远,再接再厉!面去哪儿网时,写惯了算法的我突然让写了几个多线程编程,有点蒙蔽,最近好好整理一下) 死锁发生的原因: 1、系统资源...
  • zhangliangzi
  • zhangliangzi
  • 2016年10月03日 19:11
  • 3379

(十四)java多线程之死锁

本人邮箱: kco1989@qq.com 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://github.com/...
  • tianshi_kco
  • tianshi_kco
  • 2016年10月31日 22:11
  • 561

Java 多线程同步与死锁

在多线程中如何找到安全问题所在: 1,明确哪些代码是多线程运行代码 2,明确共享数据 3,明确多线程运行代码中哪些代码是操作共享数据的 静态的同步方法中,使用锁是该方法所在类的字节码文...
  • pjz90
  • pjz90
  • 2013年03月10日 14:51
  • 6029

多线程死锁及解决办法

死锁是由于不同线程按照不同顺序进行加锁而造成的。如: 线程A:对lock a加锁 => 对lock b加锁 => dosth => 释放lock b => 释放lock a 线程B:对...
  • zgaoq
  • zgaoq
  • 2017年05月18日 17:22
  • 1007

《java并发编程实战》读书笔记——避免死锁的发生

我们使用加锁机制来确保线程安全,但如果过度地使用加锁,则可能导致锁顺序死锁。当一个线程永远地持有一个锁,并且其他线程都尝试获得这个锁时,那么他们将永远被阻塞。 在数据库系统的设中考虑了检测死锁以及从...
  • Great_Smile
  • Great_Smile
  • 2015年03月25日 13:50
  • 825

多线程——死锁产生的条件和过程分析

package com.qianfeng.demo02; /** * 出现死锁的四个必要条件: * 1.互斥条件:资源不能互相共享,各用各的。 * 2.请求与保持条件:已经得到了资源的线程,还想...
  • u012369385
  • u012369385
  • 2016年08月20日 10:14
  • 2574

Java多线程产生死锁的原因和解决方法

一般造成死锁必须同时满足如下4个条件:  1,互斥条件:线程使用的资源必须至少有一个是不能共享的;  2,请求与保持条件:至少有一个线程必须持有一个资源并且正在等待获取一个当前被其它线程持有的资源; ...
  • hongtashan11
  • hongtashan11
  • 2011年05月24日 20:11
  • 1404
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程实现死锁(Java实现)
举报原因:
原因补充:

(最多只允许输入30个字)