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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马刘涛 中级黑马   /  2012-7-16 16:49  /  1177 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class TicketsSystem_deadLock
  2. {
  3.     public static void main(String[] args)
  4.     {
  5.         //main线程开始跑,发送start消息让持有obj锁的Thread0线程就绪,
  6.         //由于中途让main线程休息了200毫秒,所以Thread0线程开始跑,
  7.         //main线程休息完200毫秒,开始让Thread1线程就绪,而后开跑,
  8.         //由于Thread0线程未跑结束,并没有释放obj锁,所以导致Thread1
  9.         //试图使用obj锁失败,从而导致同步死锁.
  10.         //简单来说就是T0,T1共用1把锁,T0还没有使用完这把锁,T1想抢锁,2个人
  11.         //就开始不跑别的事,开始互相抢锁.也就是2个人同步的时间片出现交集.
  12.         //可让main线程休息足够长时间,让T0跑完,再让T1跑.
  13.         SellThread6 st = new SellThread6();               
  14.         new Thread(st).start();
  15.         try
  16.         {
  17.             Thread.sleep(200);
  18.         }
  19.         catch(Exception e)
  20.         {
  21.             e.printStackTrace();
  22.         }        
  23.         st.b = true;
  24.         new Thread(st).start();        
  25.     }
  26. }

  27. class SellThread6 implements Runnable
  28. {
  29.     boolean b = false;
  30.     int tickets=100;
  31.     Object obj=new Object();
  32.     public void run()
  33.     {
  34.         if(b==false)
  35.         {
  36.             while(true)
  37.             {
  38.                 sellTicket();
  39.             }
  40.         }
  41.         else
  42.         {
  43.             while(true)
  44.             {               
  45.                 synchronized(obj)
  46.                 {
  47.                     try
  48.                     {
  49.                         Thread.sleep(100);
  50.                     }
  51.                     catch(Exception e)
  52.                     {
  53.                         e.printStackTrace();
  54.                     }
  55.                     synchronized(this)
  56.                     {
  57.                         if(tickets>0)
  58.                         {
  59.                            
  60.                             System.out.println("obj:"+Thread.currentThread().getName()+" sell tickets:"+tickets);
  61.                             tickets--;
  62.                         }
  63.                     }
  64.                 }
  65.             }
  66.         }
  67.     }
  68.     public synchronized void sellTicket()
  69.     {
  70.         synchronized(obj)
  71.         {
  72.             if(tickets>0)
  73.             {
  74.                 try
  75.                 {
  76.                     Thread.sleep(10);
  77.                 }
  78.                 catch(Exception e)
  79.                 {
  80.                     e.printStackTrace();
  81.                 }
  82.                 System.out.println("sell():"+Thread.currentThread().getName()+" sell tickets:"+tickets);
  83.                 tickets--;
  84.             }
  85.         }
  86.     }
  87. }
复制代码
注释为对该死锁产生原因的理解,大家可以讨论下。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马