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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 鲍阳 中级黑马   /  2015-3-6 00:31  /  689 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 鲍阳 于 2015-3-6 00:31 编辑

这个是毕老师视频里的例子,day11里的DeadLockDemo.java。有两个疑问:
1.为什么要加try{Thread.sleep(5);}catch(Exception e){}这行呢,不加这行好像就不容易出死锁问题了
2.如果把Ticket t=new Ticket();Thread t1=new Thread(t);Thread t2=new Thread(t);这三行换成后面这俩就不会死锁了,(Thread t1=new Thread(new Ticket(true));Thread t2=new Thread(new Ticket(false))),是不是因为后面是new了两不同的Ticket对象,所以t1、t2的同步函数用的this锁不是同一个了
  1. class Ticket implements Runnable
  2. {
  3.         private int tick=100000;
  4.         boolean flag=true;
  5.         Object obj=new Object();
  6.         Ticket(){}
  7.         Ticket(boolean flag){
  8.                 this.flag=flag;
  9.         }
  10.         public void run()
  11.         {
  12.                 if (flag)
  13.                 {
  14.                
  15.                         while (true)
  16.                         {
  17.                                 synchronized(obj){
  18.                                         show();
  19.                                 }
  20.                         }
  21.                 }
  22.                 else
  23.                         while (true)
  24.                         {
  25.                                 //synchronized(obj)
  26.                                
  27.                                         show();
  28.                                        
  29.                        
  30.                 }

  31.         }
  32.         public synchronized void show()
  33.         {       
  34.                 synchronized(obj){
  35.                                        
  36.                         if (tick>0)
  37.                         {
  38.                                 try{Thread.sleep(15);}catch(Exception e){}
  39.                                 System.out.println(Thread.currentThread().getName()+"..."+tick--+"张票...");
  40.                         }
  41.                 }
  42.         }
  43. }
  44. class  DeadLockDemo
  45. {
  46.         public static void main(String[] args)
  47.         {
  48.                 Ticket t=new Ticket();
  49.                 Thread t1=new Thread(t);
  50.                 Thread t2=new Thread(t);
  51.                 //Thread t1=new Thread(new Ticket(true));
  52.                 //Thread t2=new Thread(new Ticket(false));
  53.                 t1.start();
  54.                 //try{Thread.sleep(5);}catch(Exception e){}
  55.                 t.flag=false;
  56.                 t2.start();
  57.                
  58.         }
  59. }
复制代码



0 个回复

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