日期:2014-05-20  浏览次数:20686 次

自己写了个多线程卖票,对synchronize的疑问
本帖最后由 blogzlh 于 2014-03-19 16:02:45 编辑
private static Integer ticketNum = 100;//总共有100张票
private static Boolean flag=true;
private int num;

public Office(int num){//售票窗口号
this.num = num;
}

public void run() {
while(true){
synchronized (flag) { //就是这个地方有疑问!!flag的时候,不会出现卖同一张票,但是用ticketNum就                                      //会出现卖同一张票!!!这是为什么呢??????
if(ticketNum<=0)
           break;
System.out.println(this.num+"窗口在卖票第"+ticketNum+"张票~~~~~~~~~");
ticketNum--;
}
try {
Thread.sleep(1);//切换下一个购买者的停顿时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}


调用代码:
ExecutorService exec = Executors.newCachedThreadPool();
    for (int i = 0; i < 5; i++)
        exec.execute(new Office(i));
    exec.shutdown();
------解决方案--------------------

ticketNum实例发生变化了
ticketNum--;

flag 你的代码中没有发现改变的地方