黑马程序员技术交流社区
标题:
关于多线程售票窗口问题 求教
[打印本页]
作者:
横看成岭侧成锋
时间:
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