黑马程序员技术交流社区

标题: 关于多线程的死锁问题怎么解决的。 [打印本页]

作者: 王浩骅    时间: 2013-5-10 16:00
标题: 关于多线程的死锁问题怎么解决的。
本帖最后由 王浩骅 于 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();
  
}
}

就像这样的一个死锁,有什么好的解决办法吗?
作者: xiaohu1218    时间: 2013-5-10 17:15
将synchronized括号内的对象统一写成o1或o2就能正常运行了,楼主可以看下毕老师java基础第11、12天的视频,讲线程方面的知识,很详细的



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


什么叫统一写成,举个例子!
作者: 刘胜寒    时间: 2013-5-14 12:19
王浩骅 发表于 2013-5-11 07:30
什么叫统一写成,举个例子!

就是使用第三方提供的锁。。。
让线程使用同一把锁。以实现同步。
你的代码我没仔细看。。
作者: xuemeng    时间: 2013-5-14 19:23
本帖最后由 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();
}
}

作者: xiaohu1218    时间: 2013-5-16 19:12
王浩骅 发表于 2013-5-11 07:30
什么叫统一写成,举个例子!

多线程中需要使用同一个监视器。
如果不是同一个监视器的话,那么这几个线程就是各自为政,互不相关,就失去了实际意义。
这个程序我看了,虽然有多个线程,但是没有共享数据,实际功能不太明确,看的有点晕。
所以我才建议楼主看毕老师的视频,希望楼主有更多收获。

作者: 袁梦希    时间: 2013-5-18 12:52
如果问题已经解决了,那么大家请把帖子的类型改为“已解决”,在自己帖子的左下角点编辑,然后选择帖子的分类进行改正。{:soso_e163:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2