我被要求制造死锁情况。下面的代码永远不会创建死锁,尽管有可能会死锁。 原因如下。 如果两个或多个线程都调用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();
}
}
答案 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
然后发生死锁。