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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

这个是毕老师 多线程-售票的例子,我出现了一个让我无法理解的问题。照常把代码敲一下。

  1. class xianchen extends Thread
  2. {
  3.         private static int pic = 20;
  4.         
  5.         public void run()
  6.         {
  7.                 while(true){
  8.                         if(pic >0)
  9.                         System.out.println(currentThread().getName()+"..."+pic--);
  10.                
  11.                 }        
  12.         }
  13. }
复制代码
  1. class threadDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 xianchen xc1 = new xianchen();
  6.                 xianchen xc2 = new xianchen();
  7.                 xianchen xc3 = new xianchen();
  8.                 xianchen xc4 = new xianchen();
  9.                 xc1.start();
  10.                 xc2.start();
  11.                 xc3.start();
  12.                 xc4.start();
  13.                
  14.                
  15.                
  16.         }
  17. }
复制代码

结果{:3_46:}震惊了。我已经static全局pic了,结果出下如下情况,理论上每个线程打印出来的都是不一样的数字吧?





360截图20140925161918776.png (65.93 KB, 下载次数: 1)

编译后打印结果

编译后打印结果

12 个回复

倒序浏览
你根本没有一点理解多线程嘛,好好看看多线程吧,这样写不错才怪!
回复 使用道具 举报
要想输出的没有重复的,要将if那句的判断和下一句的pic--那个弄成原子操作才行。
回复 使用道具 举报
水竹 发表于 2014-9-25 16:39
你根本没有一点理解多线程嘛,好好看看多线程吧,这样写不错才怪!

关键是我完全按毕老师写的啊,他的视频上没错,我的错了
回复 使用道具 举报
唐王潮 发表于 2014-9-25 16:42
关键是我完全按毕老师写的啊,他的视频上没错,我的错了

那这个是他演示的错误的例子吧?你是把所有这块的视频都看完了么?
回复 使用道具 举报
水竹 发表于 2014-9-25 16:43
那这个是他演示的错误的例子吧?你是把所有这块的视频都看完了么?

没有,我没看完一个视频,都要自己敲一遍代码,符合老师结论我才会看下一个视频,既然这个编译通过,说明写的没问题,既然出现了这个问题,我就想知道这个问题出现的原因,搞不明白会很纠结
回复 使用道具 举报
水竹 中级黑马 2014-9-25 17:05:43
7#
不是说编译通过就没有问题的,只是没有语法错误而已,就比如你写一条语句,本来应该是int a = 1;你写成了int a = 2;那不是也能通过编译么。
你上面代码出现重复的原因可以是,执行pic--的时候,一号线程读取了pic的值,然后还没改的时候零号线程也读取了pic的值,再往下进行就都打印了20这个数。
回复 使用道具 举报
水竹 发表于 2014-9-25 17:05
不是说编译通过就没有问题的,只是没有语法错误而已,就比如你写一条语句,本来应该是int a = 1;你写成了in ...

突然明白了,是线程抢夺CPU资源的问题,老师前面好像是讲过这种情况。thanks
回复 使用道具 举报
请教下你一个问题,你的上面的代码是怎么复制上去的,鼠标停在上面还能显示颜色的变化!
回复 使用道具 举报
把循环语句进行同步应该就可以了
回复 使用道具 举报
要记得添加同步代码块
回复 使用道具 举报
289623337 发表于 2014-9-25 18:16
请教下你一个问题,你的上面的代码是怎么复制上去的,鼠标停在上面还能显示颜色的变化! ...

发表话题或回复话题,上面有个括号选项,点击把代码扔进去就好了
回复 使用道具 举报
唐王潮 发表于 2014-9-25 20:25
发表话题或回复话题,上面有个括号选项,点击把代码扔进去就好了

谢谢,我试一下!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马