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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 逍遥呆 中级黑马   /  2014-9-26 15:43  /  894 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 逍遥呆 于 2014-9-26 15:55 编辑

我混乱了,怎么加都不对,总是出几个一号票,有时候还多一张票,是什么问题,还请指点下。
  1. public class Test7 {

  2.         public static void main(String[] args)
  3.         {
  4.                 //开启5个窗口买票
  5.                 new Thread(new SealWindow("1号售票窗口")).start();
  6.                 new Thread(new SealWindow("2号售票窗口")).start();
  7.                 new Thread(new SealWindow("3号售票窗口")).start();
  8.                 new Thread(new SealWindow("4号售票窗口")).start();
  9.                 new Thread(new SealWindow("5号售票窗口")).start();
  10.         }
  11. }

  12. class Ticket//设置Ticket属性只有id
  13. {
  14.         private int id;
  15.         Ticket(int id)
  16.         {
  17.                 this.id = id;
  18.         }
  19.         public int getId()
  20.         {
  21.                 return id;
  22.         }
  23. }

  24. class TicketSealCenter
  25. {
  26.         private int totalTickets = 100;//一共有100张票
  27.         private static ArrayList<Ticket> al = new ArrayList<Ticket>();
  28.         
  29.         //只有一个售票中心,所以用单例设计模式返回售票中心的对象。
  30.         private TicketSealCenter(){
  31.                 for(int id = 1;id<=totalTickets;id++)//给每个票加上号码
  32.                 {
  33.                         Ticket tic = new Ticket(id);
  34.                         al.add(tic);//将有编号的票全部存入集合中
  35.                 }
  36.         };
  37.         private static TicketSealCenter tsc = new TicketSealCenter();
  38.         public static TicketSealCenter getTicketSealCenter()
  39.         {
  40.                 return tsc;//返回售票中心的单例对象
  41.         }
  42.         
  43.         //得到一个装着所有票的集合
  44.         public ArrayList<Ticket> getAllTickets()
  45.         {
  46.                 return al;
  47.         }
  48. }

  49. class SealWindow implements Runnable
  50. {
  51.         String name = null;
  52.         Object obj = new Object();
  53.         
  54.         TicketSealCenter tsc = TicketSealCenter.getTicketSealCenter();
  55.                
  56.         ArrayList<Ticket> al = tsc.getAllTickets();
  57.         
  58.         SealWindow(String name)//传入窗口的名字
  59.         {
  60.                 this.name = name;
  61.         }
  62.         @Override
  63.         public  void run() {
  64.                
  65.                
  66.                 Iterator<Ticket> it = al.iterator();
  67.                                 
  68.                 while(it.hasNext())
  69.                 {
  70.                         Ticket t = al.remove(0);
  71.                         int num = t.getId();
  72.                         System.out.println(this.name+""+num);
  73.                 }
  74.                
  75.         }
  76. }
复制代码

3 个回复

倒序浏览
看的有点、。:lol
回复 使用道具 举报
本帖最后由 caixingke 于 2014-9-26 16:17 编辑

眼眯有点难受, 代码我就不看了.
总之, 如何确定临界资源?
共享资源就是临界资源来加同步就可以了.
临界区最好是放在共享资源的类定义中比较好, 因为这样封装性好. ---我的个人浅见.----------

什么是"临界区"? 什么是 "临界资源"?
这个东西是操作系统原理里面会讲的...
回复 使用道具 举报
没认真看   你这情况明显是操作共享数据不同步 还有就是 ArrayList是不同步的 你想同步去用Collections 工具类弄个同步的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马