为了账号安全,请及时绑定邮箱和手机立即绑定

关于线程的一个问题

关于线程的一个问题

我要变大神大神大大神 2016-12-30 13:56:00
卖票的问题,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变量的读写是无序,他们并不会一个一个的自发排队去读写这个数,而是随意读写数据,这就会造成数据之间的读写不同步。若解惑,望采纳

查看完整回答
反对 回复 2016-12-30
?
习惯受伤

TA贡献885条经验 获得超1144个赞

1、你的代码逻辑有问题,为什么呢?你的每个Ticket线程内都有100张票,也就是楼上说的400张票,所以重复是肯定的。

2、如果让这4个线程同时竞争这100张票,先让他们共享这个资源。

3、同步可以用 synchronized 关键字实现。


查看完整回答
1 反对 回复 2016-12-30
  • 四无小青年
    四无小青年
    楼主的逻辑没错,是你们的Java线程基础没学到家。在new Thread(Runnable)时,楼主传的是同一个Runnable任务,所以会创建出来的线程会共享这个Runnable任务的变量,这是多线线程基础知识,不信你自己去试试。
?
silencecorner

TA贡献10条经验 获得超3个赞

肯定要做同步处理的,正在买票的时候其他线程就不能对num进行操作。最大的一个问题就是你卖的是400张票!

查看完整回答
反对 回复 2016-12-30
  • 3 回答
  • 0 关注
  • 1347 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信