我创建了下一个简单的类代码(这只是为了澄清我的问题):
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,是:唱歌和跳舞。对于Deadlock来说,这种场景是典型的情况。
如何通过这些操作来故意创建Deadlock情况?简单的解决办法(据我所知)是将每个动作(唱歌和跳舞)定义为不同的对象,但我想知道是否还有其他方法让它们成为方法呢?
发布于 2016-07-31 16:58:14
我没有看到你的代码有任何潜在的死锁。一个线程执行一个同步的方法,在这个执行过程中,我看不到会使两个线程以不确定的方式等待对方的条件。最坏的情况是,一个线程等待另一个线程释放该方法的锁。您应该设想一个更复杂的场景:线程间共享对象或操作之间的依赖关系。
发布于 2016-07-31 17:24:26
你没有使用任何共享资源。如果没有这一点,就不会出现僵局。如果存在像A、B这样的情况,则B都需要对共享变量s进行锁定,t执行舞蹈和歌曲,并且锁是以以下方式获得的(除其他外):
A_lock(s)
A_lock(t)
跳舞
唱歌
A_release(t)
A_release(s)
B_lock(t)
B_lock(s)
跳舞
唱歌
B_release(s)
B_release(t)
如果A获得,B获得t,等待对方永久释放锁,则存在死锁的可能性。
https://stackoverflow.com/questions/38685970
复制相似问题