黑马程序员技术交流社区

标题: 多线程—3个窗口同时卖票的问题 [打印本页]

作者: 孙茜茜    时间: 2013-6-11 21:22
标题: 多线程—3个窗口同时卖票的问题
本帖最后由 孙茜茜 于 2013-6-11 22:01 编辑

跟着视频写多线程卖票的小程序,和视频里有一点点不同。本该输出数字不同的10行,
但实际输出了12行,前头1或2号票会重复输出。
怎?么?回?事?啊?
  1. class MaiPiao extends Thread
  2. {
  3.         MaiPiao(String name)
  4.         {
  5.                 super(name);
  6.         }
  7.         private static int num=1;//因3个窗口不该重复同样的票,就用静态
  8.         public void run()
  9.         {
  10.                 for (;num<=100 ;num++)
  11.                 {
  12.                         System.out.println(this.getName()+"卖出-"+num+"-号票");
  13.                 }
  14.         }
  15. }
  16. class Testmp
  17. {
  18.         public static void main(String[] args)
  19.         {
  20.                 MaiPiao a=new MaiPiao("窗口A--");
  21.                 MaiPiao b=new MaiPiao("窗口B--");
  22.                 MaiPiao c=new MaiPiao("窗口C--");
  23.                 a.start();
  24.                 b.start();
  25.                 c.start();
  26.         }
  27. }
复制代码
结果一般是这样


票.PNG (7.73 KB, 下载次数: 0)

票.PNG

作者: 王靖远    时间: 2013-6-11 21:36
没有加锁的原因吧。
作者: 孙茜茜    时间: 2013-6-11 21:44
王靖远 发表于 2013-6-11 21:36
没有加锁的原因吧。

接受这个答案了
只是加锁的知识还没学到 :(
作者: 孙茜茜    时间: 2013-6-11 22:54
王靖远 发表于 2013-6-11 21:36
没有加锁的原因吧。

再问一句,视频里老师也没有加锁,但他打出的结果不像我这样多两条,这怎么理解???
作者: 王靖远    时间: 2013-6-12 09:31
孙茜茜 发表于 2013-6-11 22:54
再问一句,视频里老师也没有加锁,但他打出的结果不像我这样多两条,这怎么理解??? ...

老师打得不够多吧。保证不出现同样的票应该用锁而不是静态啊。
作者: yasyas001    时间: 2013-6-19 09:17
加静态只是为了让有共享数据有多个线程操作的时候能够使用同一个数据源,但无法保证数据不重复,。所以在方法或者代码块上加同步,多线程应该多测试几遍




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