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

在复习毕向东老师的java视频--(138多线程-同步函数的锁是this)时(代码如下),对线程运行产生了一些疑惑,主要在后四句:
  1. t1.start();
  2. try{Thread.sleep(10);}catch(Exception e){}
  3. t.flag = false;
  4. t2.start();
复制代码
flag是为了让同步代码块和同步函数交替执行。
虽然老师让主线程等待了一会时间,但是flag还是被赋值flase,此时同步代码块应该不被执行,为什么结果还是同步代码块与同步函数交替执行?
希望同志们多多帮助

  1. class Ticket implements Runnable
  2. {
  3.         private  int tick = 100;
  4.         Object obj = new Object();
  5.         boolean flag = true;
  6.         public  void run()
  7.         {
  8.                 if(flag)
  9.                 {
  10.                         while(true)
  11.                         {
  12.                                 synchronized(this)
  13.                                 {
  14.                                         if(tick>0)
  15.                                         {
  16.                                                 try{Thread.sleep(10);}catch(Exception e){}
  17.                                                 System.out.println(Thread.currentThread().getName()+"....code : "+ tick--);
  18.                                         }
  19.                                 }
  20.                         }
  21.                 }
  22.                 else
  23.                         while(true)
  24.                                 show();
  25.         }
  26.         public synchronized void show()//this
  27.         {
  28.                 if(tick>0)
  29.                 {
  30.                         try{Thread.sleep(10);}catch(Exception e){}
  31.                         System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);
  32.                 }
  33.         }
  34. }


  35. class  ThisLockDemo
  36. {
  37.         public static void main(String[] args)
  38.         {

  39.                 Ticket t = new Ticket();

  40.                 Thread t1 = new Thread(t);
  41.                 Thread t2 = new Thread(t);
  42.                 t1.start();
  43.                 try{Thread.sleep(10);}catch(Exception e){}
  44.                 t.flag = false;
  45.                 t2.start();







  46. //                Thread t3 = new Thread(t);
  47. //                Thread t4 = new Thread(t);
  48. //                t3.start();
  49. //                t4.start();


  50.         }
  51. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马