snake_zy 2012-02-08 14:00
浏览 154
已采纳

关于java线程死锁。有问题

[code="java"]
public class DeadLockTest implements Runnable
{
private int flag = 1;

protected Object o1 = new Object();

protected Object o2 = new Object();
/**
 * run方法
 */
@Override
public void run()
{
    System.out.println("flag = " + flag);

    if(flag == 1)
    {
        synchronized (o1)
        {
            try
            {
                System.out.println("o1 is locked");
                Thread.sleep(500);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
        System.out.println("release o1");
        synchronized (o2)
        {
            System.out.println("1");
        }
    }

    if(flag == 0)
    {
        synchronized (o2)
        {
            try
            {
                System.out.println("o2 is locked");
                Thread.sleep(1000);
            }
            catch (InterruptedException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println("release o2");
        synchronized (o1)
        {
            System.out.println("0");
        }
    }

}

/**
 * main函数
 * @author kf56385
 * @param args
 */
public static void main(String[] args)
{
    DeadLockTest d1 = new DeadLockTest();
    d1.flag = 1;

    DeadLockTest d2 = new DeadLockTest();
    d2.flag = 0;

    Thread t1 = new Thread(d1);
    Thread t2 = new Thread(d2);

    t1.start();
    t2.start();
}

[/code]

按照网上写的例子,可是运行时并没有发生死锁,以下是控制台输出:
flag = 1
o1 is locked
flag = 0
o2 is locked
release o1
1
release o2
0
很奇怪,在release o1之后,要输出"1"这个值的时候 o2还是被锁住的。怎么还会有输出呢?望指教

  • 写回答

2条回答 默认 最新

  • qiemengdao 2012-02-08 14:17
    关注

    上面的代码没有死锁问题,改成这样就会死锁,为了让你肉体感觉明显,加大了sleep的参数:
    [code]
    if (flag == 1) {
    synchronized (o1) {
    try {
    System.out.println("o1 is locked");
    Thread.sleep(500);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    synchronized (o2) {
    System.out.println("1");
    }
    }
    }

        if (flag == 0) {
            synchronized (o2) {
                try {
                    System.out.println("o2 is locked");
                    Thread.sleep(10000000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                synchronized (o1) {
                    System.out.println("0");
                }
    
            }
        }
    

    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 PPOCRLabel
  • ¥15 网友们我该怎么办啊,急
  • ¥15 混合键合键合机对准标识
  • ¥100 现在不懂的是如何将当前的相机中的照片,作为纹理贴图,映射到扫描出的模型上
  • ¥15 目标跟踪,计算机视觉
  • ¥15 魔霸ROG7 pro,win11.息屏后会显示黑屏,如图,如何解决?(关键词-重新启动)
  • ¥15 有没有人知道这是哪里出了问题啊?要怎么改呀?
  • ¥200 C++表格文件处理-悬赏
  • ¥15 Windows Server2016本地登录失败
  • ¥15 复合卡卡号轨道写入芯片卡