黑马程序员技术交流社区

标题: 路人请解答 [打印本页]

作者: xmmsbb    时间: 2015-5-18 16:43
标题: 路人请解答
class Ticket extends Thread
{
        private static int num=100;
        public void run()
        {
                while(true)
                {
                        if(num>0)
                        {
                                System.out.println(Thread.currentThread().getName()+".....sale...."+num--);
                        }
                }
        }
}
class ThreadDemo11
{
        public static void main(String[] args)
        {
                Ticket t1=new Ticket();
                Ticket t2=new Ticket();
                Ticket t3=new Ticket();
                Ticket t4=new Ticket();

                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }
}

运行结果:(部分)
Thread-0.....sale....9
Thread-0.....sale....8
Thread-0.....sale....7
Thread-0.....sale....6
Thread-0.....sale....5
Thread-0.....sale....4
Thread-0.....sale....3
Thread-0.....sale....2
Thread-0.....sale....1
Thread-3.....sale....12
Thread-1.....sale....13
Thread-2.....sale....10
为什么输出num时12会在1后面?




作者: LoseMyCat    时间: 2015-5-18 21:30
这是一个线程安全的问题。不知道你有没有看过线程安全方面的知识。
Java对于多线程的处理方式是采用轮换的方式。
当Thread-3读取到num的值为13的时候,线程迅速切换成了Thread-1,并且Thread-1执行了一段时间的代码,那个时候num的值已经改变了(就像你的结果中一样num已经变成1了)。然后线程在切换到Thread-3,这个时候因为已经读取到num的值为13了,所以直接输出13。其余的Thread-2类似。

作者: leeshaodong    时间: 2015-5-18 21:32
真是大牛。线程现在还没学呢。都摆成这样了。拿HMB走人。
作者: 大西洋    时间: 2015-5-18 21:46
本帖最后由 大西洋 于 2015-5-18 21:49 编辑

因为Thread-3 在Thread-1之后抢到了资源,所以得以赶紧输出12;线程之间一直在抢资源,或者说CPU会在不同的线程间快速切换~

作者: 0416朱珅平    时间: 2015-5-18 21:57
这是多线程的问题啊,不太懂 冒个泡
作者: xmmsbb    时间: 2015-5-19 09:27
LoseMyCat 发表于 2015-5-18 21:30
这是一个线程安全的问题。不知道你有没有看过线程安全方面的知识。
Java对于多线程的处理方式是采用轮换的 ...

举个简单的例子,假设甲乙两个人各有100个苹果,我拿着一个框轮换着装甲乙两个人的苹果,我装到甲第30个苹果的时候,它已经把第30个苹果拿出来了,结果我去装乙的苹果去了,等我回来还是装甲的第30个苹果。是这个意思吧?
作者: xmmsbb    时间: 2015-5-19 09:30
0416朱珅平 发表于 2015-5-18 21:57
这是多线程的问题啊,不太懂 冒个泡

哈哈,看上面其他大牛的回帖
作者: 1017161726    时间: 2015-5-19 13:47
线程1、2、3跟0抢CPU执行权,没抢过。4个线程,一个控制台,随意会发生这种随机现象
作者: 小悟空et    时间: 2015-5-19 14:08
因为当Thread1 和2 和3 ,刚拿到数据,还没打印出来的时候,CPU执行权被Thread 0 抢到了 。并且被他一个劲的输出。最后打印完,Thread 1 。2  。3 分别拿到执行权,打印出了自己的数据。

为了防止发生这种情况,需要对线程进行同步。synchronized




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