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条)

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料