黑马程序员技术交流社区

标题: 大家看看我这个多线程死锁为什么没有实现啊? [打印本页]

作者: 张锐    时间: 2012-3-6 10:58
标题: 大家看看我这个多线程死锁为什么没有实现啊?
  1. public class TestDeathlock {

  2.         /**
  3.          * @param args
  4.          */
  5.         public static void main(String[] args) {
  6.                 DeathLock dl1 = new DeathLock(true);
  7.                 DeathLock dl2 = new DeathLock(false);
  8.                 Thread thread1 = new Thread(dl1);
  9.                 Thread thread2 = new Thread(dl2);
  10.                 thread1.start();
  11.                 thread2.start();

  12.         }

  13. }

  14. class DeathLock implements Runnable{
  15.         private boolean b ;
  16.         DeathLock(Boolean b){
  17.                 this.b = b;
  18.         }
  19.         static Object o1=new Object();
  20.         static Object o2=new Object();
  21.        
  22.         @Override
  23.         public void run() {
  24.                 if(b){
  25.                         synchronized (o1) {
  26.                                 try {
  27.                                         Thread.sleep(500);
  28.                                 } catch (InterruptedException e) {
  29.                                         // TODO Auto-generated catch block
  30.                                         e.printStackTrace();
  31.                                 }
  32.                         }
  33.                         synchronized (o2) {
  34.                                 System.out.println("这里是b为true的");
  35.                         }
  36.                 }
  37.                 if(!b){
  38.                         synchronized (o2) {
  39.                                 try {
  40.                                         Thread.sleep(500);
  41.                                 } catch (InterruptedException e) {
  42.                                         // TODO Auto-generated catch block
  43.                                         e.printStackTrace();
  44.                                 }
  45.                         }
  46.                         synchronized (o1) {
  47.                                 System.out.println("这里是b为false的");
  48.                         }
  49.                        
  50.                 }
  51.         }
  52.        
  53. }
复制代码
两句都能打印,是怎么回事呢?
作者: 刘基军    时间: 2012-3-6 11:28
以一手交钱一手交货比喻,而现在两个人互不信任,A拿着货想让B把钱先给自己,而B拿着钱想让A把货先给自己,最终造成:死锁。

应该将代码改成下面格式:
synchronized (o1)
{
   synchronized (o2) {}
}


作者: 张锐    时间: 2012-3-6 11:32
刘基军 发表于 2012-3-6 11:28
以一手交钱一手交货比喻,而现在两个人互不信任,A拿着货想让B把钱先给自己,而B拿着钱想让A把货先给自己, ...

哦哦 是啊 哈哈 确实是包含方式!!




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