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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© mishisanyi 中级黑马   /  2015-6-9 14:44  /  487 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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. }
复制代码

这段代码我执行多次,并未出现线程问题,那么线程安全到底是怎样的一种情况,在什么时候发生

2 个回复

正序浏览
线程是否发生安全问题主要是看是否有多个线程存在,多个线程是否操作共享数据。你的这段代码是存在线程安全问题的,只不过线程安全是种随机发生的情况,看不到很正常,但是一旦发生后果也可能很严重,你可以在输出语句前加入让线程等待的语句,这样会更容易观察到一些数据错误的现象。
回复 使用道具 举报
可能你没注意到吧
你把1000改小点10左右吧,会看到输出0
但是你while的条件是>0才输出的
就比如说thr1线程过了while的条件但是停住了,
换另一个线程执行,
执行完thr1又可以执行了,但是他已经过来while的判断所以直接输出了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马