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

请JAVA多线程高手看看我这个模似售票系统程序
public   class   TicketsSystem
{
public   static   void   main(String   args[])
{
SellTickets   st=new   SellTickets();
new   Thread(st).start();
new   Thread(st).start();
new   Thread(st).start();
new   Thread(st).start();
}
}
class   SellTickets   implements   Runnable
{
int   tickets=100;
public   void   run()
{
while(tickets> 0)
{
if(tickets==1)
{
try{
Thread.sleep(10);
}catch(Exception   e)
{
e.printStackTrace();
}
}
System.out.println(tickets);
tickets--;

}
}
}
最后四行输出结果是:
4
3
2
-2
我不明白的地方是:1,0,-1这三个数为什么没有输出呢?

------解决方案--------------------
首先要明白线程的cpu分配时间是由操作系统决定的
比如有三个线程(线程一,线程二,线程三)在走到System.out.println(tickets);之后,tickets--之前,它们的cpu分配时间刚好完了,此时tickets==4,换第四个线程,它打印出4,3,2以后,tickets==1,此时第四个线程进入sleep,然后第一个线程的cpu分配时间到了,执行tickets--,这时tickets==0,当它再次走到System.out.println(tickets);之前,它的cpu分配时间又完了,这时换第二个线程,它执行tickets--,此时tickets==-1,当它又再次执行到System.out.println(tickets);之前,此时它的cpu分配时间又完了,换第三个,它执行tickets--,此时tickets==-2,于是,继续执行,就有了LZ所看到的结果了。

------解决方案--------------------
volatile的本意是一个线程修改成员变量时,共享内存立即发生相应的改变,另外的线程也能同时获得修改后的新值,这里应该和这个没太大关系
啊宝说的很好的啊
volatile本来就是线程修改成员变量时 共享内存发生改变够 其他线程也同时得到修改后的值