黑马程序员技术交流社区
标题:
多线程 -卖票问题
[打印本页]
作者:
丁强强
时间:
2013-1-17 18:08
标题:
多线程 -卖票问题
本帖最后由 丁强强 于 2013-1-18 04:49 编辑
class lianxi
{
public static void main(String[] args)
{
Demo d1 = new Demo("0号窗口");
Demo d2 = new Demo("1号窗口");
Demo d3 = new Demo("2号窗口");
Demo d4 = new Demo("3号窗口");
d1.start();
d2.start();
d3.start();
d4.start();
}
}
class Demo extends Thread
{
private String name;
Demo(String name)
{
this.name = name;
};
private static int piao = 100;
public void run()
{
for (;0<piao && piao<=100 ;piao--)
{
System.out.println(name+" 第"+piao+"张");
}
};
}
复制代码
未命名.jpg
(34.72 KB, 下载次数: 40)
下载附件
2013-1-17 18:09 上传
作者:
丁强强
时间:
2013-1-17 18:11
问题是为什么我把票,静态了还是出现 卖重复的票了。不理解
作者:
周志强
时间:
2013-1-17 19:31
在这里票数是共享数据,在多线程当中,当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行。导致共享数据的错误。
实例如下:
for (;0<piao && piao<=100 ;piao--)
{很有可能:当线程d1执行到票数是72张时,就快打印时,CPU切换到其他线程d2,票数依然是72张,打印出来72,切换到线程d1时,在打印出72,所以就重复了
System.out.println(name+" 第"+piao+"张");
}
解决办法就是将此单条语句所在的函数,定义成 public synchronized void run(),试一下!
建议看看毕老师的基础视频:(
黑马程序员_毕向东_Java基础视频教程第11天-09-多线程(多线程的安全问题).avi
)
作者:
夏振博
时间:
2013-1-17 22:02
楼上基本的都说了,问这个问题说明你对同步应该不是和熟,
给你看看线程的生命周期吧 ,看图时要结合楼上说的再分析你的代码
图片1.jpg
(8.69 KB, 下载次数: 40)
下载附件
2013-1-17 21:59 上传
作者:
高浩
时间:
2013-1-18 14:21
你代码存在多线程问题,应该在对应代码加上同步代码块
作者:
再见亦是泪
时间:
2013-1-18 15:54
在里面加个同步代码块就可以解决这个问题了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2