Java 在同一对象上使用不同的操作(方法)创建死锁情况?

Java 在同一对象上使用不同的操作(方法)创建死锁情况?,java,multithreading,Java,Multithreading,我已经创建了下一个简单的类代码(这只是为了澄清我的问题): 在本例中,学生A的顺序动作是:先跳舞,然后唱歌,学生B的顺序动作是:唱歌,然后跳舞。这种情况是死锁的典型情况 如何通过这些操作故意创建一个死锁情况? 简单的解决方案(据我所知)是将每个动作(唱歌和跳舞)定义为不同的对象,但我想知道是否有其他方法将它们保留为方法?我看不到您的代码存在任何潜在的死锁。 一个线程执行一个同步的方法,在这个执行过程中,我没有看到两个线程以不确定的方式等待对方的情况。 最坏的情况是,一个线程等待另一个线程释放该方

我已经创建了下一个简单的类代码(这只是为了澄清我的问题):

在本例中,学生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);
    }
}