黑马程序员技术交流社区

标题: 求解死锁的问题 [打印本页]

作者: Dream.    时间: 2014-10-22 21:08
标题: 求解死锁的问题
为何我打的死锁 ,如果按照现在的方式重复测试很多次没有出现和谐现象,但是如果把锁换成注释掉的a,b的话一直是和谐没有出现死锁现象???

  1. class Tes implements Runnable
  2. {
  3.         private boolean flag;
  4.         //Object a = new Object();
  5.         //Object b = new Object();
  6.         Tes(boolean flag)
  7.         {
  8.                 this.flag = flag;
  9.         }
  10.         public void run()
  11.         {
  12.                 if(flag)
  13.                 {
  14.                         while(true)
  15.                         {
  16.                                 synchronized(MyLock.locka)
  17.                                 {
  18.                                         System.out.println("if a");
  19.                                         synchronized(MyLock.lockb)
  20.                                         {
  21.                                                 System.out.println("if b");
  22.                                         }
  23.                                 }
  24.                         }
  25.                 }
  26.                 else
  27.                 {
  28.                         while(true)
  29.                         {
  30.                                 synchronized(MyLock.lockb)
  31.                                 {
  32.                                        
  33.                                         System.out.println("else b");
  34.                                         synchronized(MyLock.locka)
  35.                                         {
  36.                                                 System.out.println("else a");
  37.                                         }
  38.                                 }
  39.                         }
  40.                 }
  41.         }

  42. }

  43. class MyLock
  44. {
  45.         static Object locka = new Object();
  46.         static Object lockb = new Object();
  47. }
  48. class Test
  49. {
  50.         public static void main(String[] args)
  51.         {
  52.                
  53.                 Thread t1 = new Thread(new Tes(true));
  54.                 Thread t2 = new Thread(new Tes(false));
  55.                 t1.start();       
  56.                 t2.start();

  57.         }
  58. }
复制代码

作者: Dream.    时间: 2014-10-22 21:10
如果换成a和b的对象会出现无限循环 一直没有死锁请问是什么情况???
作者: Dream.    时间: 2014-10-22 21:33
求解阿  有大神么
作者: 会飞的蜗牛    时间: 2014-10-22 21:37
Thread t1 = new Thread(new Tes(true));
Thread t2 = new Thread(new Tes(false));
产生死锁必须synchronized(某一个对象),但是你new Test()两次,a和b并不是同一个对象中的啊。你给线程上了锁,但是两个线程不是同一把锁。如果你把a,b改成static就会出现死锁了。
作者: Dream.    时间: 2014-10-22 21:50
会飞的蜗牛 发表于 2014-10-22 21:37
Thread t1 = new Thread(new Tes(true));
Thread t2 = new Thread(new Tes(false));
产生死锁必须synchroni ...

必须静态才会出现死锁么 原理是什么啊
作者: Dream.    时间: 2014-10-22 21:56
会飞的蜗牛 发表于 2014-10-22 21:37
Thread t1 = new Thread(new Tes(true));
Thread t2 = new Thread(new Tes(false));
产生死锁必须synchroni ...

我明白了。。。  t1的a和t2的a根本不是一个对象  之前试过this 和类名.class 同样是this代表两个对象吧  谢谢了哈
作者: Chopper    时间: 2014-10-23 15:01
那样一个是一个锁是t1.a和t1.b,另一个是t2.a和t2.b ,锁不一样自然就不会出现死锁的情况

作者: zd12345    时间: 2014-10-24 09:58
两个锁不一样吧!




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