我创建了下一个简单的类代码(仅用于我的问题澄清):
public class StudioClass {
synchronized void dancing(String name) {
System.out.println(name + " is dancing");
}
synchronized void singing(String name) {
System.out.println(name + " is singing");
}
public class StudentA extends Thread {
String name;
public StudentA(String name) {
this.name = name;
}
@Override
public void run() {
dancing(name);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
singing(name);
}
}
public class StudentB extends Thread {
String name;
public StudentB(String name) {
this.name = name;
}
@Override
public void run() {
singing(name);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
dancing(name);
}
}
在这个例子中,学生A的顺序动作是:跳舞然后唱歌,学生B是:唱歌而不是跳舞.这种情况是死锁的典型情况.
如何通过这些操作故意创建死锁情况?
简单的解决方案(据我所知)是将每个动作(唱歌和跳舞)定义为不同的对象,但我想知道是否还有其他方法可以将它们作为方法保存?
最佳答案 我没有看到您的代码有任何潜在的死锁.
一个线程执行一个同步的方法,在这个执行过程中,我没有看到使两个线程以不确定的方式相互等待的条件.
在最坏的情况下,一个线程等待另一个线程释放该方法的锁.
您应该想象一个更复杂的场景,即线程之间的共享对象或操作之间的相互依赖关系.