A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王浩骅 中级黑马   /  2013-5-10 16:00  /  2549 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王浩骅 于 2013-5-24 19:23 编辑

public class TestDeadLock implements Runnable {
public int flag = 1;
static Object o1 = new Object(), o2 = new Object();
public void run() {
System.out.println("flag=" + flag);
  if(flag == 1) {
   synchronized(o1) {
    try {
     Thread.sleep(500);
    } catch (Exception e) {
     e.printStackTrace();
    }
    synchronized(o2) {
     System.out.println("1");
    }
   }
  }
  if(flag == 0) {
   synchronized(o2) {
    try {
     Thread.sleep(500);
    } catch (Exception e) {
     e.printStackTrace();
    }
    synchronized(o1) {
     System.out.println("0");
    }
   }
  }
}

public static void main(String[] args) {
  TestDeadLock td1 = new TestDeadLock();
  TestDeadLock td2 = new TestDeadLock();
  td1.flag = 1;
  td2.flag = 0;
  Thread t1 = new Thread(td1);
  Thread t2 = new Thread(td2);
  t1.start();
  t2.start();
  
}
}

就像这样的一个死锁,有什么好的解决办法吗?

点评

建议楼主可以加上相应的注释,这样会清晰一些  发表于 2013-5-10 21:57

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

6 个回复

倒序浏览
将synchronized括号内的对象统一写成o1或o2就能正常运行了,楼主可以看下毕老师java基础第11、12天的视频,讲线程方面的知识,很详细的


评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 王浩骅 于 2013-5-11 10:45 编辑
xiaohu1218 发表于 2013-5-10 17:15
将synchronized括号内的对象统一写成o1或o2就能正常运行了,楼主可以看下毕老师java基础第11、12天的视频, ...


什么叫统一写成,举个例子!
回复 使用道具 举报
王浩骅 发表于 2013-5-11 07:30
什么叫统一写成,举个例子!

就是使用第三方提供的锁。。。
让线程使用同一把锁。以实现同步。
你的代码我没仔细看。。
回复 使用道具 举报
本帖最后由 xuemeng 于 2013-5-14 22:15 编辑

你要明白, 为什么会造成死锁?  
其实造成死锁的原因就是锁嵌套, 只要锁不嵌套就没问题了E!
你上面的代码是专门一个死锁例子, 没有实际意义, 并没有要实现什么功能, 所以并不好修改, 如果你的需求是 打印 0,1 01  这样的规律的结果, 那么用线程间的通讯可以:如下代码
class Resource {
boolean b;
}
class One extends Thread {
private Resource r;
public One(Resource r) {
  this.r = r;
}
public void run() {
  synchronized (r) {
   while (true) {
    if (r.b) {
     try {
      r.wait();
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
    System.out.println(0);
    r.notify();
    r.b = true;
   }
  }
}
}
class Two extends Thread {
private Resource r;
public Two(Resource r) {
  this.r = r;
}
public void run() {
  synchronized (r) {
   while (true) {
    if (!r.b) {
     try {
      r.wait();
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
    System.out.println(1);
    r.notify();
    r.b = false;
   }
  }
}
}
class Demo {
public static void main(String[] args) {
  Resource r = new Resource();
  One o = new One(r);
  Two t = new Two(r);
  o.start();
  t.start();
}
}

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
王浩骅 发表于 2013-5-11 07:30
什么叫统一写成,举个例子!

多线程中需要使用同一个监视器。
如果不是同一个监视器的话,那么这几个线程就是各自为政,互不相关,就失去了实际意义。
这个程序我看了,虽然有多个线程,但是没有共享数据,实际功能不太明确,看的有点晕。
所以我才建议楼主看毕老师的视频,希望楼主有更多收获。
回复 使用道具 举报
如果问题已经解决了,那么大家请把帖子的类型改为“已解决”,在自己帖子的左下角点编辑,然后选择帖子的分类进行改正。{:soso_e163:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马