多线程实现死锁(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多线程实现死锁现象之详细解读

这个例子个人觉得非常经典,先看完,讲解在下面啦,(^__^) 嘻嘻!/* * 死锁: * 同步中嵌套同步,而锁不同。 * 都在等待对方线程中的锁释放。 * */ public class De...

Java--多线程Thread(实现,并发并行,同步死锁,单例,线程组池)

一、线程    线程是程序执行的一条路径, 一个进程中可以包含多条线程    多线程并发执行可以提高程序的效率, 可以同时完成多项工作 二、多线程并行和并发的区别    1、并行就是两个任务同时运行,...

Java基础 - 多线程,两种实现方式(继承Thread,实现Runnable接口),设置获取名字,同步代码块、方法,死锁

Java基础 - 多线程,两种实现方式(继承Thread,实现Runnable接口),设置获取名字,同步代码块、方法,死锁...

黑马程序员——java第十一、十二天:多线程(创建线程1-2、多线程同步代码、实现Runnable接口、安全死锁)

------- android培训、java培训、期待与您交流! ----------  多线程概述 一个进程中至少有一个线程。 进程:是一个正在执行的程序。               ...

Java第七课 Java的多线程程序进程和线程的概念,实现多线程的两种方式,线程同步的原理,线程的死锁,运用wait和notify来实现producer - consumer关系,线程终止的两种情况。

程序、进程和线程 1.程序是计算机指令的集合,它以文件的形式存储在磁盘上。 2.进程:是一个程序在其自身的地址空间中的一次执行活动。 3.进程是资源申请、调度和独立运行的单位,因此,它使...

Java多线程——安全与死锁问题

实现多线程的方式 线程安全问题中synchronized同步代码块与Lock锁的使用。 解决线程安全问题产生的死锁问题。 若想共...

Java多线程探究-死锁原因

进程死锁及解决办法  一、要点提示 (1) 掌握死锁的概念和产生死锁的根本原因。 (2) 理解产生死锁的必要条件--以下四个条件同时具备:互斥条件、不可抢占条件、占有且申请条件、循环等待条件...

java多线程4--死锁

死锁的产生: 举个例子说明,有两个线程分别是t1和t2,有两个对象分别为o1和o2,t1已经拿到了o1的对象锁只要再拿到o2的对象锁线程t1就能完成;同时,线程t2已经拿到了o2的对象锁,只要再拿到...

Java多线程5—死锁和wait()、notify()、notifyAll()

在计算机领域有一个很经典的问题——哲学家进餐问题。在一个桌子旁边,围坐着五个哲学家,每个哲学家左右手边各有一支筷子。要求每个哲学家必须同时拿起两支筷子才可以吃饭。开始吃饭的时候每个哲学家都去拿身边的筷...

JAVA多线程(二)竞态条件、死锁及同步机制

4 多线程的安全问题及解决方案 这一篇博客中,我会列出Java多线程编程过程中,容易出现的安全问题(竞态条件、死锁等),以及相应的解决方案,例如同步机制等。 究竟什么是线程安全?简单的说,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程实现死锁(Java实现)
举报原因:
原因补充:

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