黑马程序员技术交流社区

标题: 多线程 -卖票问题 [打印本页]

作者: 丁强强    时间: 2013-1-17 18:08
标题: 多线程 -卖票问题
本帖最后由 丁强强 于 2013-1-18 04:49 编辑
  1. class  lianxi
  2. {
  3.         public static void main(String[] args)
  4.         {        
  5.                 Demo d1 = new Demo("0号窗口");
  6.                 Demo d2 = new Demo("1号窗口");
  7.                 Demo d3 = new Demo("2号窗口");
  8.                 Demo d4 = new Demo("3号窗口");
  9.                 d1.start();
  10.                 d2.start();
  11.                 d3.start();
  12.                 d4.start();
  13.         }
  14. }

  15. class Demo extends Thread

  16. {
  17.         private String name;
  18.         Demo(String name)
  19.         {
  20.                 this.name = name;
  21.         };
  22.         private static int piao = 100;

  23.         public void run()
  24.         {
  25.                 for (;0<piao && piao<=100 ;piao--)
  26.                 {
  27.                 System.out.println(name+"     第"+piao+"张");
  28.                 }
  29.         };

  30. }
复制代码

未命名.jpg (34.72 KB, 下载次数: 32)

未命名.jpg

作者: 丁强强    时间: 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
楼上基本的都说了,问这个问题说明你对同步应该不是和熟,
给你看看线程的生命周期吧 ,看图时要结合楼上说的再分析你的代码


作者: 高浩    时间: 2013-1-18 14:21
你代码存在多线程问题,应该在对应代码加上同步代码块
作者: 再见亦是泪    时间: 2013-1-18 15:54
在里面加个同步代码块就可以解决这个问题了




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