java - 为什么在此程序中的同一对象上没有死锁-Java Multithreading

原文 标签 java multithreading synchronized

我下面有三节课。 Main,两个线程和Obj,其方法已同步

public class DeadLocks {

    public static void main(String[] args) {
        SyncObj so = new SyncObj();
        ThreadObj to = new ThreadObj(so);
        ThreadObj1 to1 = new ThreadObj1(so);

        to.start();
        to1.start();
    }
}

class SyncObj {
    synchronized void foo() {
        System.out.println("Foo Started");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        bar();
    }

    synchronized void bar() {
        System.out.println("bar started");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        foo();
    }

}

class ThreadObj1 extends Thread {
    SyncObj so;

    public ThreadObj1(SyncObj so) {
        this.so = so;
    }

    @Override
    public void run() {
        so.bar();
    }
}

class ThreadObj extends Thread {
    SyncObj so;

    public ThreadObj(SyncObj so) {
        this.so = so;
    }

    @Override
    public void run() {
        so.foo();
    }
}

在上面的代码中,我在同一个对象上调用同步方法。两种方法同时执行和相互调用,没有死锁情况。谁能解释为什么?对不起这个愚蠢的问题。

最佳答案

据我所知,两种情况下您都使用相同的对象(so)。因此,没有死锁的情况。您将需要锁定两个或多个对象,其中每个关键部分都需要除其持有的那个以外的其他锁。该另一个锁由“另一个”线程持有。

令人困惑的是,这将启发您:“https://docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html

您将在您描述的场景中使用never ever deadlock。在这种情况下,只有一个so被共享并与之同步。

让我举一个例子来说明:

假设安迪和桑迪正在玩两个足球B1和B2。

现在进一步假设安迪和桑迪分别拥有球B1和B2。例如,安迪的球为B1,桑迪的球为B2。

现在,他们设计了一个游戏,其中每个人都需要两个球。
现在,桑迪也想要球B1,与此同时,安迪想要球B2。

而且他们两个都不能放弃他们所持的球。安迪不会放弃B1,反之亦然。

So both of them cannot continue and are stuck. We call this a deadlocked situation.

希望本示例对您有所帮助。您可以利用自己的想象力将比赛中的球数增加到3或4(依此类推..)和/或增加玩家数。

关于java - 为什么在此程序中的同一对象上没有死锁-Java Multithreading,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49542187/

相关文章:

java - JButton无法解析为类型

java thread.sleep 也让 swing ui 进入休眠状态

c# - 查看线程未正确结束

java - 同步并锁定单例工厂

java - 用于性能的 volatile 同步组合

java - 尽管包含了Jar,但找不到Java类

java - 使用netbeans根据数据库添加jpanel的动态

java - 编写自定义 jSTL 函数 - 找不到文件错误

c# - ReaderWriteLockSlim 或 Lock

java - 如何正确使用同步?