如下程序怎么会出现多个线程卖同一张票呢?多线程是怎么引用tickets这个变量的呢?谢谢!
public class RunnableThread { public static void main(String[] args) {
Ticketssell th=new Ticketssell();
new Thread(th).start();
new Thread(th).start();
new Thread(th).start();
new Thread(th).start();
new Thread(th).start();
}
}class Ticketssell implements Runnable{
  static int tickets =20;
      public void run(){
while(true){
if(tickets>0){
System.out.printf("\n"+Thread.currentThread().getName()+"现在卖第%d张票",tickets);
tickets--;
}
if(tickets<=0)break;
}
}

}

解决方案 »

  1.   

    将Ticketssell类改成如下:class Ticketssell implements Runnable {
    static int tickets = 20; static Object obj = new Object(); public void run() {
    while (true) {
    synchronized (obj) {
    if(tickets > 0){
    System.out.printf("\n" + Thread.currentThread().getName()
    + "现在卖第%d张票", tickets);
    }
    tickets--;
    if (tickets <= 0)
    break;
    }
    }
    }}------------------------------------------
    java技术论坛www.foxou.cn欢迎您
      

  2.   

    synchronized   yes这个东西
      

  3.   

    synchronized 线程同步,你的ticket在任何线程下每次都只能被一个Thread调用,这样就可以了
      

  4.   

    对于共享的资源要用同步锁啊....synchronized
      

  5.   

    Thread is important,more important synchronization
      

  6.   

    要明白多线程的执行机制:
    多线程并不是线程并行(真正的线程并行需要多个cpu),而是通过cpu时间片轮换来完成的,所以就存在一个问题,当a线程进入线程体的时候,执行了System.out语句,这是他的时间片到期了,b线程进入,b线程在他的时间片内执行完了之后,a线程接着往下运行,他用的不是b执行过的ticket--,而是原来的ticket,就导致了问题的发生