举个例子说明下,
怎样才会发生死锁呢?

解决方案 »

  1.   

      所谓死锁<DeadLock>: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等竺的进程称为死锁进程.
      由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。 
      一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被其他线程占用并堵塞了的资源。例如,如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象。
      计算机系统中,如果系统的资源分配策略不当,更常见的可能是程序员写的程序有错误等,则会导致进程因竞争资源不当而产生死锁的现象。例如, 
    进程1,2分别完全占有两种系统资源A和B,它们的进程操作分别如下(从左到右: 
    1:获得A资源,获得B资源,释放A资源,释放B资源; 
    2:获得B资源,获得A资源,释放B资源,释放A资源; 
    从1来看,它要获得B资源才会释放A资源,而获得A资源正是进程2释放B资源的条件,所以两个进程互相等待,进入死锁 下面的代码就发生了死锁。/**
     * @author bzwm
     *
     */
    public class Deadlock {

    public static void main(String args[])
    {
    final ThreadImp imp = new ThreadImp();
    //启动线程执行method1
    new Thread(new Runnable() {
    public void run() {
    imp.method1();
    }
    }).start(); //启动线程执行method2
    new Thread(new Runnable() {
    public void run() {
    imp.method2();
    }
    }).start(); }
    }class ThreadImp
    {
    private Object lock1 = new Object();

    private Object lock2 = new Object();

    public void method1()
    {
    System.out.println("---Method1 需要lock1锁---");
    synchronized (lock1)
    {
    System.out.println("---Method1 获得lock1锁---");
    // try {
    // Thread.sleep(1000);
    // } catch (InterruptedException e) {
    // e.printStackTrace();
    // }
    System.out.println("method1睡好了,准备执行invokeByMethod1");
    invokeByMethod1();
    }

    System.out.println("---Method1 释放lock1锁---");
    }

    private void invokeByMethod1()
    {
    System.out.println("---invokeByMethod1 需要lock2锁---");
    synchronized (lock2)
    {
    System.out.println("invokeByMethod1获得lock2锁,准备执行method2");
    }
    System.out.println("---invokeByMethod1 释放lock2锁---");
    }

    public void method2()
    {
    System.out.println("###Method2 需要lock2锁###");
    synchronized (lock2)
    {
    System.out.println("###Method2 获得lock2锁###");
    System.out.println("method2获得lock2锁,然后执行invokeByMethod2");
    // try {
    // Thread.sleep(100);
    // } catch (InterruptedException e) {
    // e.printStackTrace();
    // }
    invokeByMethod2();
    }
    System.out.println("###Method2 释放lock2锁###");
    }

    private void invokeByMethod2()
    {
    System.out.println("---invokeByMethod2 需要lock1锁---");
    synchronized (lock1)
    {
    System.out.println("invokeByMethod2获得lock1锁");
    }
    System.out.println("---invokeByMethod2 释放lock1锁---");
    }
    }
    产生死锁的原因主要是:
      (1) 因为系统资源不足。
      (2) 进程运行推进的顺序不合适。
      (3) 资源分配不当等。
      如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则
      就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。