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