黑马程序员技术交流社区

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

作者: mishisanyi    时间: 2015-6-9 14:44
标题: 线程安全问题
  1. package exam;


  2. class MyThread extends Thread
  3. {
  4.         static int ticketnum = 1000;
  5.         MyThread(String name)
  6.         {
  7.                 super(name);
  8.         }
  9.         public void run()
  10.         {
  11.                 syso();
  12.         }
  13.         void syso()
  14.         {
  15.                 while(ticketnum>0)
  16.                 {
  17.                         System.out.println(Thread.currentThread().getName()+":"+ticketnum--);
  18.                 }
  19.                        
  20.         }
  21.        
  22. }
  23. public class MyThreadMain
  24. {
  25.         public static void main(String[] args)
  26.         {
  27.                 Thread thread1 = new MyThread("thr1");
  28.                 Thread thread2 = new MyThread("thr2");
  29.                 Thread thread3 = new MyThread("thr3");
  30.                 Thread thread4 = new MyThread("thr4");
  31.                 thread1.start();
  32.                 thread2.start();
  33.                 thread3.start();
  34.                 thread4.start();
  35.         }
  36. }
复制代码

这段代码我执行多次,并未出现线程问题,那么线程安全到底是怎样的一种情况,在什么时候发生
作者: 半月    时间: 2015-6-9 16:48
可能你没注意到吧
你把1000改小点10左右吧,会看到输出0
但是你while的条件是>0才输出的
就比如说thr1线程过了while的条件但是停住了,
换另一个线程执行,
执行完thr1又可以执行了,但是他已经过来while的判断所以直接输出了
作者: world.net    时间: 2015-6-9 17:47
线程是否发生安全问题主要是看是否有多个线程存在,多个线程是否操作共享数据。你的这段代码是存在线程安全问题的,只不过线程安全是种随机发生的情况,看不到很正常,但是一旦发生后果也可能很严重,你可以在输出语句前加入让线程等待的语句,这样会更容易观察到一些数据错误的现象。




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