自己写了个多线程卖票,对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 你的代码中没有发现改变的地方