黑马程序员技术交流社区

标题: 问个问题 [打印本页]

作者: 进击的大鹏    时间: 2014-9-11 21:50
标题: 问个问题
class Ticket implements Runnable
{
        int ticket=100;
        public void run(){
                while(true){
                       
                        if(ticket>0){
                                i--;
                        System.out.println(Thread.currentThread().getName()+"..."+ticket);
                               
                        }
                }
        }
}

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


为什么运行结果,有两个98而没有99
作者: 雨夜忧伤    时间: 2014-9-12 01:42
随机的,多运行几次,CPU要在线程中快速切换!
同步下看看!
作者: 犹豫铅笔    时间: 2014-9-12 01:51
i--?,应换成ticket--吧。应该是线程安全问题,出现上诉的原因,可能是当ticket的值等于99时,t1刚好走到System.out.println(Thread.currentThread().getName()+"..."+ticket);这句话但还没执行,此时CPU的控制权被其它线程抢到,这里假设被t3抢到,t3抢到后执行一次循环体后,ticket值为98了,打印了一次98,CPU控制权可能刚好又被t1抢到,此时ticket的值变为98了,于是又打印一次98
作者: hailong    时间: 2014-9-12 10:34
i是哪里来的?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2