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 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?