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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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号票”为什么会输出三次??

6 个回复

倒序浏览
多试试会有不同收获
回复 使用道具 举报
因为你的线程是不安全的,3个线程在启动时,都读到了i=0,但都还未读到i++,所以就输出了3次。多运行会有很多种答案

点评

非常感谢,按照楼下这位前辈的办法已经解决了  发表于 2015-4-21 00:12
回复 使用道具 举报
因为for循环在循环体结束时才会i++
所以,当线程运行完i<100,进入方法体停住后。另一个线程进来。i值不会改变。
解决办法是将代码改成一句话,或者保证只能有一个线程改变变量。

点评

嗯,多谢回答  发表于 2015-4-21 00:09
回复 使用道具 举报
突然世界晴 发表于 2015-4-20 16:58
多试试会有不同收获

嗯,用while的话就可以了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马