java多线程死锁

时间:2014-06-22 18:50:56

标签: java multithreading

我被要求制造死锁情况。下面的代码永远不会创建死锁,尽管有可能会死锁。 原因如下。 如果两个或多个线程都调用method1()和method2(),则很有可能发生死锁,因为如果thead 1在执行method1()时获取对Sting对象的锁定,并且线程2在执行method2时获取对Integer对象的锁定()两者将等待彼此释放对Integer和String的锁定以继续进行,这将永远不会发生。

我想创建一个死锁情况,但是没有创建它。

class Task implements Runnable {

        public void method1() {
            synchronized (String.class) {
                System.out.println("Aquired lock on String.class object");

                synchronized (Integer.class) {
                    System.out.println("Aquired lock on Integer.class object");
                }
            }
        }

        public void method2() {
            synchronized (Integer.class) {
                System.out.println("Aquired lock on Integer.class object");

                synchronized (String.class) {
                    System.out.println("Aquired lock on String.class object");
                }
            }
        }

        @Override
        public void run() {
            method1();
            method2();

        }
    }

    public class DeadLock {
        public static void main(String args[]) {
            Runnable r= new Task();
            Thread t1 = new Thread(r);
            Thread t2 = new Thread(r);
            t1.start();
            t2.start();

        }
    }

2 个答案:

答案 0 :(得分:0)

这不太可能造成死锁,因为Task总是尝试method1然后是method2。你需要有2个不同的runnables,它们以相反的顺序调用method1和method2。另外,您可能应该考虑使用倒计时锁存器,您的任务必须在run()的开头等待,以提供2个线程实际并发执行的更高概率。

答案 1 :(得分:0)

如果您想增加死锁的机会,可以在获取第一个锁之后,以及尝试获取第二个锁之前使线程休眠。一个粗略的例子:

public static void main(String[] args) {
  Thread t1 = new Thread(new Runnable() {
    public void run() {
      synchronized (String.class) {
        System.out.println("Thread 1 after acquiring String lock");
        Thread.sleep(5000); // Sleep for 5 seconds
        synchronized (Integer.class) {
          System.out.println("Thread 1 after acquiring Integer lock");
        }
      }
    }
  });

  Thread t2 = new Thread(new Runnable() {
    public void run() {
      synchronized (Integer.class) {
        System.out.println("Thread 2 after acquiring Integer lock");
        Thread.sleep(5000); // Sleep for 5 seconds
        synchronized (String.class) {
          System.out.println("Thread 2 after acquiring String lock");
        }
      }
    }
  });

  t1.start();
  t2.start();
}

你会看到:

Thread 1 after acquiring String lock
Thread 2 after acquiring Integer lock

Thread 2 after acquiring Integer lock
Thread 1 after acquiring String lock

然后发生死锁。