如下程序怎么会出现多个线程卖同一张票呢?多线程是怎么引用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;
}
}
}
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;
}
}
}
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欢迎您
多线程并不是线程并行(真正的线程并行需要多个cpu),而是通过cpu时间片轮换来完成的,所以就存在一个问题,当a线程进入线程体的时候,执行了System.out语句,这是他的时间片到期了,b线程进入,b线程在他的时间片内执行完了之后,a线程接着往下运行,他用的不是b执行过的ticket--,而是原来的ticket,就导致了问题的发生