黑马程序员技术交流社区

标题: this锁 [打印本页]

作者: 尹兆国    时间: 2014-6-20 12:37
标题: this锁
本帖最后由 尹兆国 于 2014-6-20 13:11 编辑

  毕老师 day11 ThisLockDemo.java

  1. /*
  2. 同步函数用的是哪一个锁呢?
  3. 函数需要被对象调用。那么函数都有一个所属对象引用。就是this。
  4. 所以同步函数使用的锁是this。

  5. 通过该程序进行验证。

  6. 使用两个线程来买票。
  7. 一个线程在同步代码块中。
  8. 一个线程在同步函数中。
  9. 都在执行买票动作。



  10. */
  11. class Ticket implements Runnable
  12. {
  13.         private  int tick = 100;
  14.         Object obj = new Object();
  15.         boolean flag = true;
  16.         public  void run()
  17.         {
  18.                 if(flag)
  19.                 {
  20.                         while(true)
  21.                         {
  22.                                 synchronized(this)
  23.                                 {
  24.                                         if(tick>0)
  25.                                         {
  26.                                                 try{Thread.sleep(10);}catch(Exception e){}
  27.                                                 System.out.println(Thread.currentThread().getName()+"....code : "+ tick--);
  28.                                         }
  29.                                 }
  30.                         }
  31.                 }
  32.                 else
  33.                         while(true)
  34.                                 show();
  35.         }
  36.         public synchronized void show()//this
  37.         {
  38.                 if(tick>0)
  39.                 {
  40.                         try{Thread.sleep(10);}catch(Exception e){}
  41.                         System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);
  42.                 }
  43.         }
  44. }


  45. class  ThisLockDemo
  46. {
  47.         public static void main(String[] args)
  48.         {

  49.                 Ticket t = new Ticket();

  50.                 Thread t1 = new Thread(t);
  51.                 Thread t2 = new Thread(t);
  52.                 t1.start();
  53.                 try{Thread.sleep(10);}catch(Exception e){}
  54.                 t.flag = false;
  55.                 t2.start();







  56. //                Thread t3 = new Thread(t);
  57. //                Thread t4 = new Thread(t);
  58. //                t3.start();
  59. //                t4.start();

  60.   
  61.         }
  62. }
复制代码
我在自己机器上运行的结果,怎么没有Thread1 show啊?


  视频中运行的结果




  file:///C:\Documents and Settings\Administrator\Local Settings\Temp\mx38E.pngfile:///C:\Documents and Settings\Administrator\Local Settings\Temp\mx38E.png

作者: 倪大大    时间: 2014-6-20 14:14
try{Thread.sleep(10);}catch(Exception e){}  你这句话是让主线程 也就是main方法执行的线程sleep
这时候主线程就睡眠 还没执行下面 t2.start()  因为你数字很小 主线程睡眠这一丁点时间内 t1线程就能执行完打印操作, 你把数改到1000 就能看到两个线程都再打印的效果了
作者: 尹兆国    时间: 2014-6-20 18:31
倪大大 发表于 2014-6-20 14:14
try{Thread.sleep(10);}catch(Exception e){}  你这句话是让主线程 也就是main方法执行的线程sleep
这时 ...

嗯 让main多睡会儿 呵呵




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