weidwonder 2014-07-15 02:56 采纳率: 100%
浏览 2419
已结题

JAVA中多线程读取成员变量的重复问题

这是个模拟卖票的问题,使用一个对象实现Runnable接口建立四个线程,这个对象有100张票,四个进程同时卖,因为没使用锁,所以会出现负数票,但是为什么会出现相同的票呢?8号票卖了四次,是因为成员变量在if之后进栈保存了值?然后直接用这个num输出吗?

代码:

 class Ticket implements Runnable//extends Thread
{
    private int num = 100       public void run()//这时不能抛出异常,因为覆盖的原函数没有抛出异常,必须catch
    {
        while(true)
        {
            if(num>0)
            {
                try{
                    Thread.sleep(2);

                }
                catch(InterruptedException e){}
                System.out.println(Thread.currentThread().getName()+" sale "+num--);
            }
            else break;
        }
    }
}

class Demo
{
    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();
    }
}

部分输出

Thread-1 sale 12
Thread-0 sale 13
Thread-0 sale 10
Thread-1 sale 9
Thread-3 sale 9
Thread-2 sale 10
Thread-2 sale 8
Thread-1 sale 8
Thread-0 sale 8
Thread-3 sale 8
Thread-2 sale 7
Thread-1 sale 6
Thread-0 sale 5
Thread-3 sale 4
Thread-2 sale 3
Thread-1 sale 2
Thread-0 sale 1
Thread-3 sale 0
Thread-2 sale -1
Thread-1 sale -2
  • 写回答

3条回答 默认 最新

      报告相同问题?

      相关推荐 更多相似问题

      悬赏问题

      • ¥15 在matlab中如何进行三个参数的离散傅里叶逆变换(idft)
      • ¥15 遇到问题了,求解答!
      • ¥15 请问coppliasim eduUR5视觉抓取怎么实现仿真,
      • ¥30 JavaWeb实验(购物平台)
      • ¥15 八路抢答器倒计时设计时显示器不输出,只能显示0
      • ¥15 用C语言随机生成一个迷宫
      • ¥15 超多因素的正交方案设计
      • ¥15 Scratch~汽车小游戏
      • ¥30 OSGB转换为3dtiles
      • ¥25 用于Audio的芯片中“Audio Interface”和“Mode Control”是什么?