关于死锁,并用Java实现一个死锁

产生死锁的原因主要是:

(1) 因为系统资源不足。

(2) 进程运行推进的顺序不合适。

(3) 资源分配不当等。

如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则

就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

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

(1) 互斥条件:一个资源每次只能被一个进程使用。

(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之

一不满足,就不会发生死锁。

死锁的解除与预防:

理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和

解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确

定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态

的情况下占用资源。因此,对资源的分配要给予合理的规划。

下面就用Java来故意实现一个死锁,这也是常见面试题之一:

package 死锁;
class A{
    synchronized void funA(B b){
        String name = Thread.currentThread().getName();
        System.out.println(name+"进入A.foo");
        /*try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }*/
        System.out.println(name+"调用B类的last方法");
        b.last();
    }
    synchronized void last()
    {
        System.out.println("A的last方法");
    }
}
class B{
    synchronized void funB(A a){
        String name = Thread.currentThread().getName();
        System.out.println(name+"进入B.foo");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(name+"调用A类的last方法");
        a.last();
    }
    synchronized void last()
    {
        System.out.println("B的last方法");
    }
}
public class DeadLockDemo implements Runnable{
    A a=new A();
    B b=new B();
    public DeadLockDemo() {
        // TODO Auto-generated constructor stub
        new Thread(this).start();
        a.funA(b);

    }
    public void run(){
        b.funB(a);
    }
    public static void main(String []args)
    {

            new DeadLockDemo();

    }
}
时间: 2024-11-06 18:48:51

关于死锁,并用Java实现一个死锁的相关文章

java 实现一个死锁

/** * 死锁:两个或多个线程在执行过程中,相互争夺资源而造成的一种互相等待的现象 * 实现一个死锁 * <p> * <p> * 查看死锁 * 1. 在当前类的文件夹下,打开终端运行:jps -l 获得进程号 * 2. 继续运行:jstack <进程号> 查看死锁详细信息 */ public class DeadLockDemo { public static void main(String[] args) { String lock1 = "qwqw&q

定位数据库死锁,和初步解决死锁办法(后发制人)

1.目前我只是在sql 2008上实验成功: 在数据库开启跟踪标识: DBCC TRACEON(1204,-1)DBCC TRACEON(1222,-1) 这两个跟踪标记都是将死锁写到错误日志中,不过1204是以文本格式进行,而1222是以XML格式保存. 开启后通过查看数据库日志文件就可以找到是那个语句引发死锁. 1.模拟一个死锁: 1 DBCC TRACEON(1204,-1) 2 DBCC TRACEON(1222,-1) 3 4 CREATE TABLE Lock1(C1 int def

Java学习笔记——面试常客:写出一个死锁的例子

现在的面试挺蛋疼,为了考察大家的语言掌握水平,类似这样的题特别多,不过在某个角度来说确实能看出一个人对某个知识点的理解,就比如今天这个死锁的小例子,主要考察大家对线程死锁概念的理解程度,也考察大家对java语言的敲代码水平,下面是一个死锁的简单例子: <span style="font-size:18px;">class Test implements Runnable { private boolean flag; //flag标签,让t1和t2线程执行不同代码 publ

63.JAVA编程思想——死锁

63.JAVA编程思想--死锁 由于线程可能进入堵塞状态,而且由于对象可能拥有"同步"方法--除非同步锁定被解除,否则线程不能访问那个对象--所以一个线程完全可能等候另一个对象,而另一个对象又在等候下一个对象,以此类推. 这个"等候"链最可怕的情形就是进入封闭状态--最后那个对象等候的是第一个对象!此时,所有线程都会陷入无休止的相互等待状态,大家都动弹不得.我们将这种情况称为"死锁".尽管这种情况并非经常出现,但一旦碰到,程序的调试将变得异常艰难

Java死锁范例以及如何分析死锁(转载自ImportNew)

本文由 ImportNew - 范琦琦 翻译自 journaldev.欢迎加入翻译小组.转载请见文末要求. 死锁是两个甚至多个线程被永久阻塞时的一种运行局面,这种局面的生成伴随着至少两个线程和两个或者多个资源.在这里我已写好一个简单的程序,它将会引起死锁方案然后我们就会明白如何分析它. Java死锁范例 ThreadDeadlock.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

Java自学-多线程 死锁

Java 演示多线程死锁 当业务比较复杂,多线程应用里有可能会发生死锁 步骤 1 : 演示死锁 线程1 首先占有对象1,接着试图占有对象2 线程2 首先占有对象2,接着试图占有对象1 线程1 等待线程2释放对象2 与此同时,线程2等待线程1释放对象1 这样就会...一直等待下去 package multiplethread; import charactor.Hero; public class TestThread { public static void main(String[] args

Python 官方代码threading模块的一个死锁的bug

Python的threading模块有一个比较严重的bug:那就是可能会让线程的等待提前结束或者延迟,具体的原因是因为线程的wait操作判断超时时依赖于实时时间,即通过time.time()获取到的时候,为了显示这个问题,请看下面的例子: from threading import Thread from threading import Event import time e = Event() stop = False class MyThread(Thread): def __init__

从一个死锁看mysql innodb的锁机制

背景及现象 线上生产环境在某些时候经常性的出现数据库操作死锁,导致业务人员无法进行操作.经过DBA的分析,是某一张表的insert操 作和delete操作发生了死锁.简单介绍下数据库的情况(因为涉及到真实数据,这里做了模拟,不影响具体的分析和分析的结果.)假设存在如下2张表: Order 表的数据如下: Customer表的数据如下: Order和Customer 在实体关系上存在一个关联,即order实体拥有一个指向customer实体的指针.在数据库设计的时 候,order表的custome

写一个死锁程序

/** 死锁 产生死锁的原因 多个线程由于争夺资源而产生的资源阻塞状态 同步的前提 2个以上的线程 包含2 多个线程使用同一个锁 @author WangShuang */public class Demo {public static void main(String[] args) {Test t = new Test(true);Thread rr=new Thread(t);rr.start();Test t1 = new Test(false);Thread rr1=new Threa