卖票的问题,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();
}
}
运行结果:为什么同一张票会被重复卖出去?,我想知道造成这一现象的原因和过程讲解,求大神指导。 我知道加个同步锁就没事啦~ 可是我就想知道造成这一现象的过程和原因
3 回答
已采纳
四无小青年
TA贡献88条经验 获得超43个赞
四个线程,每个线程都会读取并打印num然后把num-1。现在想象这么一种情况,线程一读取了num=96,还没来得及打印和执行--操作,线程二也读取了num=96,这样就会造成问题所提情况。由于你没有加锁所以线程对num变量的读写是无序,他们并不会一个一个的自发排队去读写这个数,而是随意读写数据,这就会造成数据之间的读写不同步。若解惑,望采纳
习惯受伤
TA贡献885条经验 获得超1144个赞
1、你的代码逻辑有问题,为什么呢?你的每个Ticket线程内都有100张票,也就是楼上说的400张票,所以重复是肯定的。
2、如果让这4个线程同时竞争这100张票,先让他们共享这个资源。
3、同步可以用 synchronized 关键字实现。
添加回答
举报
0/150
提交
取消