关于线程的一个问题

卖票的问题,4个线程一起买100张票

public class Ticket implements Runnable {
	private int num = 100;
	
	Object obj = new Object();

	@Override
	public void run() {
		while (true){
			
			try{
				Thread.sleep(10);
			}catch(InterruptedException e){}
			
				if (num > 0){
					
					System.out.println(Thread.currentThread().getName()+"...sale..."+num--);
				}
			
		}
	}

}

-----
public class TicketDemo {

	public static void main(String[] args) {
		Ticket t = new Ticket();
		
		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
		Thread t3 = new Thread(t);
		Thread t4 = new Thread(t);
		
		t1.start();
		t2.start();
		t3.start();
		t4.start();
		

	}

}

运行结果:

spacer.gif

http://img.mukewang.com/5865f61500019b0402240463.jpg为什么同一张票会被重复卖出去?,我想知道造成这一现象的原因和过程讲解,求大神指导。       我知道加个同步锁就没事啦~    可是我就想知道造成这一现象的过程和原因

我要变大神大神大大神
浏览 1349回答 3
3回答

四无小青年

四个线程,每个线程都会读取并打印num然后把num-1。现在想象这么一种情况,线程一读取了num=96,还没来得及打印和执行--操作,线程二也读取了num=96,这样就会造成问题所提情况。由于你没有加锁所以线程对num变量的读写是无序,他们并不会一个一个的自发排队去读写这个数,而是随意读写数据,这就会造成数据之间的读写不同步。若解惑,望采纳

习惯受伤

1、你的代码逻辑有问题,为什么呢?你的每个Ticket线程内都有100张票,也就是楼上说的400张票,所以重复是肯定的。2、如果让这4个线程同时竞争这100张票,先让他们共享这个资源。3、同步可以用 synchronized 关键字实现。

silencecorner

肯定要做同步处理的,正在买票的时候其他线程就不能对num进行操作。最大的一个问题就是你卖的是400张票!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java