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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 友来友网 中级黑马   /  2014-6-12 17:06  /  1678 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 友来友网 于 2014-6-13 17:58 编辑

今天下午学习了一下线程的死锁,写了个练习

  1. public class TestDeadLock implements Runnable {
  2.         public int flag = 1;
  3.         static Object o1 = new Object(), o2 = new Object();
  4.         
  5.         public void run() {
  6.                 System.out.println("flag: "+flag);
  7.                 if(flag == 1) {
  8.                         synchronized(o1) {
  9.                                 try {
  10.                                         Thread.sleep(500);
  11.                                 } catch(Exception e) {
  12.                                         e.printStackTrace();        
  13.                                 }
  14.                         }
  15.                         synchronized(o2) {
  16.                                 System.out.println("1");
  17.                         }
  18.                 } else {
  19.                         synchronized(o2) {
  20.                                 try {
  21.                                         Thread.sleep(500);
  22.                                 } catch(Exception e) {
  23.                                         e.printStackTrace();        
  24.                                 }
  25.                         }
  26.                         synchronized(o1) {
  27.                                 System.out.println("2");
  28.                         }
  29.                 }
  30.         }
  31.         
  32.         public static void main(String[] args) {
  33.                 TestDeadLock td1 = new TestDeadLock();
  34.                 TestDeadLock td2 = new TestDeadLock();
  35.                 td1.flag = 1;
  36.                 td2.flag = 0;
  37.                 new Thread(td1).start();
  38.                 new Thread(td2).start();
  39.         }
  40. }
复制代码

按道理这段代码应该出现死锁的情况,可是为什么没有出现呢

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

9 个回复

倒序浏览
alive 发表于 2014-6-12 23:07
1.while(true)  你没一直让程序运行
2. 你的同步嵌套  有问题 两个synchronized没嵌套  ...

谢谢,我知道了,主要是两个synchronized没嵌套
回复 使用道具 举报
HF_Opticalix 发表于 2014-6-12 23:21
楼上说的很对了
1 死锁是建立在while无限循环的基础上,死锁住了才会停下
2 synchronized要嵌套 ...

非常感谢:)
回复 使用道具 举报
moon1993zs 发表于 2014-6-13 00:21
我帮你改了下程序

public class TestDeadLock implements Runnable {

看了你这个我完全懂了,谢谢啊
回复 使用道具 举报
18353666072 发表于 2014-6-13 15:41
什么叫死锁:
就是A里有B,B里有A;,你中有我,我中有你,,我不让你,你不让我,,,结果就锁住了,,
...

谢谢哥们的帮助
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马