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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 麻仁博 中级黑马   /  2015-4-17 23:47  /  428 人查看  /  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 个回复

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