我正在尝试在此程序中实现死锁条件 这个程序没有给出死锁条件。为什么? 请告诉我这段代码有什么问题。
输出结果为:
Thread1:锁定整数
Thread2:锁定字符串
Thread1:锁定字符串
Thread2:锁定整数
代码:
class Dead {
public void meth1() {
synchronized (Integer.class) {
System.out.println("Thread 1: locked Integer");
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
System.out.println(e);
}
synchronized (String.class) {
System.out.println("Thread 1: locked String");
}
}
public void meth2() {
synchronized (String.class) {
System.out.println("Thread 2: locked String");
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
System.out.println(e);
}
synchronized (Integer.class) {
System.out.println("Thread 2: locked Integer");
}
}
}
class MThread1 extends Thread {
Dead d;
MThread1(Dead d) {
this.d = d;
}
public void run() {
d.meth1();
}
}
class MThread2 extends Thread {
Dead d;
MThread2(Dead d) {
this.d = d;
}
public void run() {
d.meth2();
}
}
public class Thread1 {
public static void main(String[] args) {
// Dead d = new Dead();
MThread1 t1 = new MThread1(new Dead());
MThread2 t2 = new MThread2(new Dead());
t1.start();
t2.start();
}
}
答案 0 :(得分:2)
写作时
synchronized (Integer.class) {
System.out.println("Thread 1: locked Integer");
}
它锁定Integer.class对象并立即解锁它。你想要这个:
synchronized(Integer.class) {
System.out.println("Thread 1: locked Integer");
try {
Thread.sleep(5000);
} catch(InterruptedException e) {
System.out.println(e);
}
synchronized(String.class) {
System.out.println("Thread 1: locked String");
}
}
答案 1 :(得分:1)
为什么你会期望它变成僵局?请尝试以下代码:
//in method meth1
synchronized(Integer.class) {
//blah blah
synchronized(String.class) {
//blah blah
}
}
//in method meth2
synchronized(String.class) {
//blah blah
synchronized(Integer.class) {
//blah blah
}
}
请参阅此处获取锁定的方式,如果您尝试多次运行,您将看到死锁。
在你的情况下,你只是获得一个类对象的锁定(而其他方法等待它)并从一个方法释放锁定而其他方法接受它,因此没有死锁。
当meth1
锁定Integer.class
并等待锁定String.class
而meth2
将锁定String.class
并等待等待Integer.class
时,会发生死锁锁定meth1
所持有的$accepted = $currentUser->potentialFriendsOfMine()->where('helper_id', $input);
。