黑马程序员技术交流社区

标题: 关于多线程售票窗口问题 求教 [打印本页]

作者: 横看成岭侧成锋    时间: 2015-4-20 16:40
标题: 关于多线程售票窗口问题 求教
import java.lang.*;
class MP implements Runnable
{
        private int i = 0;
        public void run()
        {
                for (;i < 100 ; i++)
                {
                        System.out.println(i+"号票...被"+Thread.currentThread().getName()+"窗口卖出");
                }
        }
}
class  MPDemo
{
        public static void main(String[] args)
        {
                MP m = new MP();
                new Thread(m).start();
                new Thread(m).start();
                new Thread(m).start();
        }
}

0号票...被Thread-0窗口卖出
0号票...被Thread-1窗口卖出
0号票...被Thread-2窗口卖出
3号票...被Thread-2窗口卖出
4号票...被Thread-2窗口卖出
5号票...被Thread-2窗口卖出
6号票...被Thread-2窗口卖出
7号票...被Thread-2窗口卖出
8号票...被Thread-2窗口卖出
9号票...被Thread-2窗口卖出
2号票...被Thread-1窗口卖出
1号票...被Thread-0窗口卖出


请问“0号票”为什么会输出三次??

作者: 突然世界晴    时间: 2015-4-20 16:58
多试试会有不同收获
作者: 396460221    时间: 2015-4-20 17:06
因为你的线程是不安全的,3个线程在启动时,都读到了i=0,但都还未读到i++,所以就输出了3次。多运行会有很多种答案
作者: 曾宇    时间: 2015-4-20 17:54
因为for循环在循环体结束时才会i++
所以,当线程运行完i<100,进入方法体停住后。另一个线程进来。i值不会改变。
解决办法是将代码改成一句话,或者保证只能有一个线程改变变量。
作者: 横看成岭侧成锋    时间: 2015-4-21 00:07
突然世界晴 发表于 2015-4-20 16:58
多试试会有不同收获

嗯,用while的话就可以了




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