Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java多线程死锁_Java_Multithreading - Fatal编程技术网

java多线程死锁

java多线程死锁,java,multithreading,Java,Multithreading,我被要求创造一个死锁的局面。下面的代码永远不会给我造成死锁,尽管有可能会造成死锁。 原因如下。 如果method1()和method2()都将被两个或多个线程调用,则很有可能出现死锁,因为如果ad 1在执行method1()时获得Sting对象的锁,而线程2在执行method2()时获得Integer对象的锁两者都将等待对方释放对Integer和String的锁定,以进一步进行,这是永远不会发生的 我想创造一个死锁的局面,但不是创造它 class Task implements Runnable

我被要求创造一个死锁的局面。下面的代码永远不会给我造成死锁,尽管有可能会造成死锁。 原因如下。 如果method1()和method2()都将被两个或多个线程调用,则很有可能出现死锁,因为如果ad 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();

        }
    }

这不太可能造成死锁,因为任务总是先尝试method1,然后尝试method2。您需要有两个不同的Runnable,它们以相反的顺序调用method1和method2。此外,您可能需要考虑在代码< >()(或代码)的开始时等待任务的倒计时锁存器,以提供2个线程同时执行的更高概率。

< P>如果要增加死锁的机会,可以在线程获得第一个锁之后休眠,在它试图获取第二个锁之前。一个粗略的例子:

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


然后死锁发生。

问题是什么?你有问题吗?更新我的帖子。我想创造一个死锁的场景,你的工作总是被否决!好的,谢谢,但是为什么我们需要创建两个Runnable呢?我应该把这两种方法移到哪里。你的意思是创建另一个Runnable并以相反的顺序调用方法吗?谢谢@fajarkoe。好像是死锁。它没有抛出任何异常。如何打印死锁异常详细信息?死锁没有异常。当代码引发异常时,将生成异常。也许你可以详细说明你想看到什么样的细节?
Thread 2 after acquiring Integer lock
Thread 1 after acquiring String lock