黑马程序员技术交流社区

标题: 线程问题。 [打印本页]

作者: 18643448863    时间: 2014-10-13 15:00
标题: 线程问题。
  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的情况。不是输出完就自减过了么。

作者: Quasimodo    时间: 2014-10-13 15:28
继续往下看视频,马上就会讲到。这是多线程的安全问题
作者: 18643448863    时间: 2014-10-13 16:32
Quasimodo 发表于 2014-10-13 15:28
继续往下看视频,马上就会讲到。这是多线程的安全问题

就是因为看了安全也不明白才问出来
作者: Quasimodo    时间: 2014-10-13 18:26
18643448863 发表于 2014-10-13 16:32
就是因为看了安全也不明白才问出来

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

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

QQ图片20141013185851.png





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