繁体   English   中英

僵局的情况

[英]Deadlock situation

我在理解这个程序中的死锁情况概念时遇到了一些麻烦。 我得到输出为:输入amethod进入bmethod然后发生死锁情况。 既然我的方法是一个同步方法,不应该先完全执行,即通过调用bsum方法然后启动新线程。 请解释...

public class Deadlock 
{
    public static void main(String[] args) 
    {

        A a= new A();
        B b= new B();
        new MainClass1(a,b);
        new MainClass2(a,b);
    }

}
class MainClass1 extends Thread
{
    A a;
    B b;
    MainClass1(A a,B b)
    {
        super();
        this.a=a;
        this.b=b;
        start();
    }
    public void run()
    {
        a.amethod(b);
    }
}
class MainClass2 extends Thread
{
    A a;
    B b;
    MainClass2(A a,B b)
    {
        super();
        this.a=a;
        this.b=b;
        start();
    }
    public void run()
    {
        b.bmethod(a);
    }

}
class A
{
    public synchronized void amethod(B b)
    {
        System.out.println("Entered amethod");
        try{
            Thread.sleep(500);
        }catch(Exception e){}
        b.bsum(2,3);
    }
    public synchronized void asum(int a,int b)
    {
        System.out.println("Sum in A is");
        System.out.println(a+b);
    }
}
class B
{
    public synchronized void bmethod(A a)
    {
        System.out.println("Entered bmethod");
        try{
            Thread.sleep(500);
        }catch(Exception e){}
        a.asum(3, 5);
    }
    public synchronized void bsum(int a, int b)
    {
        System.out.println("Sum in B is");
        System.out.println(a+b);
    }
}

您似乎在另一个对象的方法中使用对象ab 当被调用的方法被同步时,没有人可以使用它使用的资源,因此两种方法都需要锁定的东西=>死锁。 您应该与两种方法的公共对象同步,最好在两者之外。

实际上你已经启动了两个线程...让我们调用线程1和2

所以当线程1获取对象A的锁定并且在线程2获取对象B的锁定并且调用bmethod的同时调用方法amethod时会发生什么。 现在A想要调用被锁定的b的sum方法,因为B已经锁定了对象B.并且B想要调用A的sum方法,其中A已经获得了A的对象并且它没有释放锁直到它完成了sum方法的调用。

只是从sum方法中删除synchronized关键字,它将工作(我的意思是不进入死锁条件)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM