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 ogg dd trandata 报错
  • ¥15 高缺失率数据如何选择填充方式
  • ¥50 potsgresql15备份问题
  • ¥15 Mac系统vs code使用phpstudy如何配置debug来调试php
  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错