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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丁强强 中级黑马   /  2013-1-17 18:08  /  1676 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 丁强强 于 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, 下载次数: 35)

未命名.jpg

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
问题是为什么我把票,静态了还是出现 卖重复的票了。不理解
回复 使用道具 举报
在这里票数是共享数据,在多线程当中,当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行。导致共享数据的错误。
实例如下:
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

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼上基本的都说了,问这个问题说明你对同步应该不是和熟,
给你看看线程的生命周期吧 ,看图时要结合楼上说的再分析你的代码

回复 使用道具 举报
你代码存在多线程问题,应该在对应代码加上同步代码块
回复 使用道具 举报
在里面加个同步代码块就可以解决这个问题了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马