Java 在同一对象上使用不同的操作(方法)创建死锁情况?
我已经创建了下一个简单的类代码(这只是为了澄清我的问题): 在本例中,学生A的顺序动作是:先跳舞,然后唱歌,学生B的顺序动作是:唱歌,然后跳舞。这种情况是Java 在同一对象上使用不同的操作(方法)创建死锁情况?,java,multithreading,Java,Multithreading,我已经创建了下一个简单的类代码(这只是为了澄清我的问题): 在本例中,学生A的顺序动作是:先跳舞,然后唱歌,学生B的顺序动作是:唱歌,然后跳舞。这种情况是死锁的典型情况 如何通过这些操作故意创建一个死锁情况? 简单的解决方案(据我所知)是将每个动作(唱歌和跳舞)定义为不同的对象,但我想知道是否有其他方法将它们保留为方法?我看不到您的代码存在任何潜在的死锁。 一个线程执行一个同步的方法,在这个执行过程中,我没有看到两个线程以不确定的方式等待对方的情况。 最坏的情况是,一个线程等待另一个线程释放该方
死锁的典型情况
如何通过这些操作故意创建一个死锁
情况?
简单的解决方案(据我所知)是将每个动作(唱歌和跳舞)定义为不同的对象,但我想知道是否有其他方法将它们保留为方法?我看不到您的代码存在任何潜在的死锁。
一个线程执行一个同步的方法,在这个执行过程中,我没有看到两个线程以不确定的方式等待对方的情况。
最坏的情况是,一个线程等待另一个线程释放该方法的锁。
您应该想象一个更复杂的场景,线程之间共享对象或操作之间相互依赖。您没有使用任何共享资源。没有这一点,就不会出现僵局。
如果出现类似于a、B的情况,则两者都需要对共享变量s、t进行锁定,以执行舞蹈和歌曲,并且锁是通过以下方式获得的(除其他方式外):
A_锁
A_锁(t)
跳舞
唱歌
A_释放(t)
(s)
B_锁(t)
B_锁
跳舞
唱歌
B_发布
B_释放(t)
如果a获取s和B获取t并等待对方释放永久锁,则有可能出现死锁。我的意思是,学生a先执行动作x,然后执行动作y,学生B先执行动作y,然后执行动作x。有没有办法从这个场景中获得死锁?在您的场景中,每个线程都在等待轮到它。若要发生死锁,您必须假设两个线程可能会等待对方继续。您应该想象一个更复杂的场景,线程之间共享对象或操作之间相互依赖。
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);
}
}