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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 麻仁博 中级黑马   /  2015-4-17 23:47  /  427 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 麻仁博 于 2015-4-17 23:49 编辑

  1. /*
  2. *  模拟一个火车站卖票程序,需求5个窗口,需要多线程完成.
  3. */
  4. class Tickets implements Runnable
  5. {
  6.          private final ReentrantLock lock = new ReentrantLock();
  7. private String name;
  8.                          Tickets(String name )
  9.                          {
  10.                                  this.name=name;
  11.                          }
  12.         @Override
  13.         public void run()
  14.         {
  15.                
  16.                 while(true)
  17.                 {
  18.                         
  19.                 lock.lock();
  20.                                 
  21.                         

  22.                                 
  23.                         if (tic.hasNum())
  24.                                         {
  25.                         
  26.                                 System.out.println(name+"号窗口"+"卖出了1张票,还有票:"+tic.getNum());
  27.                         
  28.                                         }
  29.                         else
  30.                                         {
  31.                                                 break;
  32.                                         }
  33.                         
  34.                 lock.unlock();
  35.                                 
  36.                 }
  37.         }
  38.         
  39. }
  40. class tic
  41. {
  42.         private static int num;
  43.         public tic(int num)
  44.         {
  45.                 tic.num=num;
  46.                
  47.         }
  48.         public static int getNum()
  49.         {
  50.                         return --num;

  51.         }
  52.         public static boolean hasNum()
  53.         {
  54.                 if (num>0)
  55.                 {
  56.                 return true;        
  57.                 }
  58.                 else
  59.                 {
  60.                         
  61.                         return false;

  62.                 }
  63.                
  64.         }
  65.         public static void setNum(int num)
  66.         {
  67.                 tic.num=num;
  68.         }
  69.         
  70. }
  71. public class Demo29 {
  72.         

  73.         
  74.         public static void main(String[] args)
  75.         {
  76.                 tic t=new tic(10);
  77.                
  78.         
  79.                 new Thread(new Tickets("1")).start();
  80.                 new Thread(new Tickets("2")).start();
  81.                 new Thread(new Tickets("3")).start();
  82.                 new Thread(new Tickets("4")).start();
  83.                 new Thread(new Tickets("5")).start();
  84.         }

  85. }
复制代码

2 个回复

正序浏览
额 我自己想明白了
第一个错误是  我用得锁不对  这个锁多次创建了 (这里还是有个问题  被final修饰过后,这个对象是唯一的 ,那不同的线程进来创建  是不是都有了这么一个唯一的对象)
所以多个线程用了多个锁   
第二个错误  如果用synchronized 的话 执行结束 判断是否还有票 ,没有票  break了之后  锁会自动释放
但是我用lock 的话就不行,必须在break 之前 释放锁   不然其他线程结束不了
回复 使用道具 举报
为什么我这里用 lock的话会有错误,首张票可能会有俩个线程一起 执行 用synchronized 就不会了。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马