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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 18643448863 中级黑马   /  2014-10-13 15:00  /  1854 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class ChuangKou extends Thread
  2. {
  3.        
  4.         public static int piao = 100;
  5.         ChuangKou(String name)
  6.         {
  7.                 super(name);
  8.         }
  9.         public void run()
  10.         {
  11.                 while(true)
  12.                 {
  13.                         if(piao>0)
  14.                                 System.out.println(getName()+"......."+piao--);
  15.                 }
  16.         }
  17. }

  18. class  MaiPiao
  19. {
  20.         public static void main(String[] args)
  21.         {
  22.                 ChuangKou P1 = new ChuangKou("chuangkou1");
  23.                 ChuangKou P2 = new ChuangKou("chuangkou2");
  24.                 ChuangKou P3 = new ChuangKou("chuangkou3");
  25.                 P1.start();
  26.                 P2.start();
  27.                 P3.start();
  28.         }
  29. }
复制代码
piao=100 是静态的 可是在执行的时候 为什么还会出现打印两次100的情况。不是输出完就自减过了么。

4 个回复

倒序浏览
继续往下看视频,马上就会讲到。这是多线程的安全问题
回复 使用道具 举报
Quasimodo 发表于 2014-10-13 15:28
继续往下看视频,马上就会讲到。这是多线程的安全问题

就是因为看了安全也不明白才问出来
回复 使用道具 举报
18643448863 发表于 2014-10-13 16:32
就是因为看了安全也不明白才问出来

因为(piao--)是先打印,后才-1的。  如果先线程1在打印完还没来得急-1的时候就sleep了,这时后面来的线程2获取CPU使用权,进来后就继续打印原来的数了。
值得注意的是,线程1是获取了piao的值,然后,再打印再-1的,所以当他重新获取CPU使用权的时候,就不会再获取piao的值了,直接用sleep前获取到的值-1。
回复 使用道具 举报
在下面多写条输出语句,打印--后的票数就可以验证:

QQ图片20141013185851.png (1.34 KB, 下载次数: 16)

QQ图片20141013185851.png
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马