首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >死锁情况

死锁情况
EN

Stack Overflow用户
提问于 2012-10-08 14:39:56
回答 2查看 184关注 0票数 3

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

代码语言:javascript
复制
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);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-08 14:53:43

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

因此,当线程1获取对象A的锁并调用方法amethod时,同时线程2获取了对象B的锁并调用了bmethod。现在A想调用被锁定的B的sum方法,因为B已经拥有对象B的锁。B想调用A的sum方法,其中A已经获得了A的对象,并且直到调用sum方法完成后才释放锁。

只需从sum方法中删除synchronized关键字,它就会工作(我的意思是不会进入死锁状态)

票数 1
EN

Stack Overflow用户

发布于 2012-10-08 14:45:59

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12776512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档