线程java的死锁

时间:2016-07-26 11:56:17

标签: java multithreading deadlock

我是线程的新手,并提出了一个死锁示例。 我试图重现死锁场景,但代码工作正常没有任何问题。

请指导我错在哪里。 以下是代码段

package Practice;

public class Deadlock {

    public static void main(String[] args) {

        Deadlock a = new Deadlock();
        Threadslock first = new Threadslock(a);
        Threadslock second = new Threadslock(a);
        first.setName("First");
        second.setName("Second");
        first.start();
        second.start();

    }

}

class Threadslock extends Thread
{
    Deadlock lock ;
    private String anotherLock = "";
    Threadslock(Deadlock lo)
    {
        lock = lo;
    }
    public void run()
    {

        if(getName().equals("First"))
        {
            synchronized(lock)
            {
                synchronized(anotherLock)
                {
                    try
                    {
                    Thread.sleep (2000);
                    }
                    catch(InterruptedException r)
                    {

                    }
                System.out.println("First Thread");
                System.out.println("Next Step in First");
                }
            }
        }
        else
        {
            synchronized(anotherLock)
            {
                synchronized(lock)
                {
                    try{
                        Thread.sleep (2000);    
                    }
                    catch(Exception e)
                    {

                    }

                System.out.println("Second Thread");
                System.out.println("Next Step in Second");
                }
            }   
        }
    }
}

输出如下:

第一线程
第一步中的下一步

第二线程
第二步中的下一步

2 个答案:

答案 0 :(得分:1)

为了创建死锁,需要共享两个锁。试试这个

package Practice;

public class Deadlock {

    public static void main(String[] args) {

        Deadlock l1 = new Deadlock();
        Deadlock l2 = new Deadlock();
        Threadslock first = new Threadslock("First", l1, l2);
        Threadslock second = new Threadslock("Second", l2, l1);
        first.start();
        second.start();

    }

}

class Threadslock extends Thread
{
    Deadlock first;
    Deadlock second;
    String name;

    Threadslock(String name, Deadlock first, Deadlock second)
    {
        this.name = name;
        this.first = first;
        this.second = second;
    }
    public void run()
    {

        synchronized(first)
            {
                try
                    {
                    Thread.sleep (2000);
                    }
                    catch(InterruptedException r)
                    {

                    }
                synchronized(second)
                {

                System.out.println(name + " Thread");
                System.out.println("Next Step in " + name);
                }
            }

    }
}

编辑:在获取锁之间增加了睡眠

答案 1 :(得分:1)

正如@Sean Bright建议的那样,你在错误的地方添加睡眠。

此外,在两个线程中都有两个anotherLock个实例,它永远不会死锁,因为Thread First和Second Thread都可以获得自己的anotherLock。所以你必须让两个线程共享同一个另一个锁。

请检查下面的代码,希望它有所帮助。

public class Deadlock {

    public static void main(String[] args) {

        Deadlock a = new Deadlock();
        String anotherLock = "";
        Threadslock first = new Threadslock(a,anotherLock);
        Threadslock second = new Threadslock(a,anotherLock);
        first.setName("First");
        second.setName("Second");
        first.start();
        second.start();

    }

}

class Threadslock extends Thread
{
    Deadlock lock ;
    String anotherLock;
    Threadslock(Deadlock lo, String anotherLock)
    {
        lock = lo;
        this.anotherLock = anotherLock;
    }
    public void run()
    {

        if(getName().equals("First"))
        {
            synchronized(lock)
            {
                System.out.println("First Thread");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                synchronized(anotherLock)
                {
                    try
                    {
                    Thread.sleep (2000);
                    }
                    catch(InterruptedException r)
                    {

                    }
                System.out.println("Next Step in First");
                }
            }
        }
        else
        {
            synchronized(anotherLock)
            {
                System.out.println("Second Thread");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                synchronized(lock)
                {
                    try{
                        Thread.sleep (2000);    
                    }
                    catch(Exception e)
                    {

                    }
                System.out.println("Next Step in Second");
                }
            }   
        }
    }
}