黑马程序员技术交流社区

标题: 线程同步遇到问题了,求指导 [打印本页]

作者: viliv715    时间: 2014-9-25 18:45
标题: 线程同步遇到问题了,求指导
需求:编写三各类Ticket、SealWindow、TicketSealCenter分别代表票信息、售票窗口、售票中心。售票中心分配一定数量的票,由若干个售票窗口进行出售。
运行的时候有重复的票号,我已经在卖票的方法上添加了synchronized关键字,还是会出现问题,但是我找不到问题出在哪里了,谢谢大家了
  1. public class TicketDemo {

  2.         public static void main(String[] args) {       
  3.                 new Thread(new SealWindow("1号窗口")).start();
  4.                 new Thread(new SealWindow("2号窗口")).start();
  5.                 new Thread(new SealWindow("3号窗口")).start();
  6.                 new Thread(new SealWindow("4号窗口")).start();
  7.         }
  8. }
  9. //票信息
  10. class Ticket {
  11.         private static int ticketid;

  12.         public static int getTicketid() {
  13.                 return ticketid;
  14.         }
  15.        
  16.         public static void setTicketid(int ticket) {
  17.                 ticketid = ticket;
  18.         }
  19. }
  20. //售票窗口
  21. class SealWindow implements Runnable {
  22.         private String ticketname;
  23.         TicketSealCenter tsc = null;;
  24.        
  25.         public SealWindow(String ticketname){
  26.                 this.ticketname = ticketname;
  27.                 tsc = TicketSealCenter.getInstance();
  28.         }
  29.         public void sellTicket(){
  30.        
  31.                 while(!tsc.hasTicket()){
  32.                         System.out.println(ticketname+"卖出了第" + tsc.getid()+"号票!");
  33.                         if (tsc.hasTicket()) {
  34.                                 System.out.println(ticketname+"的票已卖完!!");
  35.                         }
  36.                 }
  37.                
  38.         }
  39.         public void run() {
  40.                 sellTicket();
  41.         }
  42. }
  43. //售票中心
  44. class TicketSealCenter {
  45.         private static TicketSealCenter tsc = new TicketSealCenter();
  46.         private static Ticket ticket = new Ticket();
  47.        
  48.         private static int sumticket = 100;
  49.         private static boolean flag = false;
  50.        
  51.         private TicketSealCenter(){}
  52.        
  53.         public static TicketSealCenter getInstance(){
  54.                 return tsc;
  55.         }
  56.         //询问是否有票,设置票面ID,并返回该ID
  57.         public static synchronized boolean hasTicket(){
  58.                 if(sumticket > 0){
  59.                         ticket.setTicketid(sumticket);
  60.                         sumticket--;
  61.                 }else {
  62.                         flag =true;
  63.                 }
  64.                 return flag;
  65.         }
  66.         public int getid(){
  67.                 return ticket.getTicketid();
  68.         }
  69. }
复制代码








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2