黑马程序员技术交流社区

标题: 关于死锁的问题,有人能回答出这个问题吗,哪一个是死锁 [打印本页]

作者: 覃勇    时间: 2013-5-3 14:04
标题: 关于死锁的问题,有人能回答出这个问题吗,哪一个是死锁

  1. /*
  2.         所谓死锁就是在一个锁中嵌套另外一个锁,两个线程持有各自的锁,但都需要到对方的锁里面去运行
  3. */
  4. class Ticket implements Runnable
  5. {       
  6.         private int Ticket = 100;               
  7.         boolean flag = true;
  8.         Object obj = new Object();
  9.         public void run()
  10.         {
  11.                 if(flag)
  12.                 {       
  13.                         while(true)
  14.                         {
  15.                                 synchronized(obj)                //一定要注意同步锁添加在那个地方加
  16.                                 {
  17.                                         show();
  18.                                 }
  19.                         }

  20.                 }
  21.                 else
  22.                 {       
  23.                         while(true)
  24.                         show();
  25.                 }
  26.         }
  27.         public synchronized void show()
  28.         {
  29.                         synchronized(obj)                //一定要注意同步锁添加在那个地方加
  30.                         {
  31.                                 if(Ticket>0)
  32.                                         {
  33.                                         //try{Thread.sleep(10);}catch (Exception e){}
  34.                                         System.out.println(Thread.currentThread().getName()+"----"+(Ticket--));
  35.                                         }
  36.                         }       
  37.         }
  38. }
  39. class DeadLockDemo
  40. {
  41.         public static void main(String[] args)
  42.         {
  43.                 Ticket t = new Ticket();
  44.                 Thread d1 = new Thread(t);
  45.                 Thread d2 = new Thread(t);
  46.                 d1.start();
  47.                 try{Thread.sleep(10);}catch (Exception e){}
  48.                 t.flag = false;
  49.                 d2.start();
  50.         }
  51. }
复制代码

  1. /*
  2.         ==================上面是死锁还是下面是死锁,说出理由=========================
  3. */
  4. class Ticket implements Runnable
  5. {       
  6.         private int Ticket = 30000;               
  7.         boolean flag = true;
  8.         Object obj = new Object();
  9.         public void run()
  10.         {
  11.                 if(flag)
  12.                 {       
  13.                         while(true)
  14.                         {
  15.                                 synchronized(obj)                //一定要注意同步锁添加在那个地方加
  16.                                 {
  17.                                         show();
  18.                                 }
  19.                         }

  20.                 }
  21.                 else
  22.                 {       
  23.                         show();
  24.                 }
  25.         }
  26.         public synchronized void show()
  27.         {
  28.                 while(true){
  29.                         synchronized(obj)                //一定要注意同步锁添加在那个地方加
  30.                         {
  31.                                 if(Ticket>0)
  32.                                         {
  33.                                         //try{Thread.sleep(10);}catch (Exception e){}
  34.                                         System.out.println(Thread.currentThread().getName()+"----"+(Ticket--));
  35.                                         }
  36.                         }       
  37.                 }
  38.         }
  39. }
  40. class DeadLockDemo
  41. {
  42.         public static void main(String[] args)
  43.         {
  44.                 Ticket t = new Ticket();
  45.                 Thread d1 = new Thread(t);
  46.                 Thread d2 = new Thread(t);
  47.                 d1.start();
  48.                 try{Thread.sleep(10);}catch (Exception e){}
  49.                 t.flag = false;
  50.                 d2.start();
  51.         }
  52. }
复制代码

作者: 覃勇    时间: 2013-5-3 14:05
首先说下这两个程序的区别,主要是把while(true)放的位置不相同
作者: 殇_心。    时间: 2013-5-3 15:10
本帖最后由 殇_心。 于 2013-5-3 15:11 编辑

这个位置不一样。结果大不一样了。
第一个出现死锁原因:2个线程抢。
而第二个不是死锁的原因:你run方法里面调用的show函数。
(注意没有用while(true)),也就调用一次。
也就是说如果线程只运行show一次,run方法就结束了。
也就是说线程就结束了。不存在争抢的条件。
所以第二个是不会出现死锁情况的。






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