A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 进击的大鹏 中级黑马   /  2014-9-11 21:50  /  853 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

3 个回复

倒序浏览
随机的,多运行几次,CPU要在线程中快速切换!
同步下看看!
回复 使用道具 举报
犹豫铅笔 来自手机 中级黑马 2014-9-12 01:51:07
藤椅
i--?,应换成ticket--吧。应该是线程安全问题,出现上诉的原因,可能是当ticket的值等于99时,t1刚好走到System.out.println(Thread.currentThread().getName()+"..."+ticket);这句话但还没执行,此时CPU的控制权被其它线程抢到,这里假设被t3抢到,t3抢到后执行一次循环体后,ticket值为98了,打印了一次98,CPU控制权可能刚好又被t1抢到,此时ticket的值变为98了,于是又打印一次98
回复 使用道具 举报
i是哪里来的?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马