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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王瀛 高级黑马   /  2013-5-30 11:02  /  1194 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王瀛 于 2013-5-31 10:09 编辑

刚看完同步函数,一开始对于synchronized函数中隐藏的锁的对象是哪个还是不太明白。

后来没看源码自己重新敲了下卖票的例子。貌似懂了,写下来,高手帮忙看看,我理解的对不对?
  1. class Ticket implements Runnable
  2. {
  3.         private int num = 50;
  4.         private boolean flag = true;
  5.         public boolean getFlag()
  6.         {
  7.                 return this.flag;
  8.         }
  9.         public void setFlag(boolean fl)
  10.         {
  11.                 this.flag = fl;
  12.         }
  13.         //Object obj = new Object();
  14.         public void run()
  15.         {
  16.                 if (flag)
  17.                 {
  18.                         while (true)
  19.                         {
  20.                                 synchronized(this)//<====================二、类中的成员是通过对象调用的,谁调用的它,this就代表谁。
  21.                                 {
  22.                                         if (num>0)
  23.                                         {
  24.                                                 try
  25.                                                 {
  26.                                                         Thread.sleep(10);
  27.                                                 }
  28.                                                 catch (Exception e)
  29.                                                 {
  30.                                                 }
  31.                                                 
  32.                                                         System.out.println(Thread.currentThread().getName()+"代码块___正在出售第"+num--+"张票");
  33.                                         }
  34.                                 }
  35.                         }
  36.                 }
  37.                 else
  38.                         while (true)
  39.                         {        
  40.                                 show();
  41.                         }
  42.         }
  43.         public synchronized void show()//<====================一、毕老师说:函数都有一个所属对象的引用,这个引用就是this,所以同步函数隐藏的锁是this
  44.         {
  45.                 if (num>0)
  46.                 {
  47.                         try
  48.                         {
  49.                                 Thread.sleep(10);
  50.                         }
  51.                         catch (Exception e)
  52.                         {
  53.                         }
  54.                         System.out.println(Thread.currentThread().getName()+"函数~~~~正在出售第"+num--+"张票");
  55.                 }
  56.         }
  57. }


  58. class  TicketDemo
  59. {
  60.         public static void main(String[] args)
  61.         {
  62.                 Ticket t = new Ticket();//<====================三、这里创建了实现Runnable接口的实例对象,是唯一的
  63.                 Thread t1 = new Thread(t);
  64.                 Thread t2 = new Thread(t);//<====================四、这里t1和t2对应的是两个线程对象,但是传入的Runnable接口实例都是同一个t
  65.                 t1.start();//<====================五、两个线程对象分别调用了各自的start()方法,操作的是同一个Runnable接口实例对象
  66.                 try
  67.                 {
  68.                         Thread.sleep(10);
  69.                 }
  70.                 catch (Exception e)
  71.                 {
  72.                 }
  73.                 t.setFlag(false);
  74.                 t2.start();
  75.         }
  76. }
  77. //综合三至五,得出一、二中的同步代码块的锁:this和同步函数隐藏的锁,指的都是实现了Runnable接口的实例对象,并且是同一个,所以能够实现多线程同步
复制代码


Ps:代码中注释的字有点儿小,粘贴下来了:
一、毕老师说:函数都有一个所属对象的引用,这个引用就是this,所以同步函数隐藏的锁是this;
二、类中的成员是通过对象调用的,谁调用的它,this就代表谁;
三、这里创建了实现Runnable接口的实例对象,是唯一的;
四、这里t1和t2对应的是两个线程对象,但是传入的Runnable接口实例都是同一个t;
五、两个线程对象分别调用了各自的start()方法,操作的是同一个Runnable接口实例对象;

综合三至五,得出一、二中的同步代码块的锁:this和同步函数隐藏的锁,指的都是实现了Runnable接口的实例对象,并且是同一个,所以能够实现多线程同步



评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

3 个回复

倒序浏览
个人认为,楼主的理解是正确的
只是觉得在主函数里面的那个try没必要写了,这里面的Tread.sleep(10);应该是让主线程睡觉,等主线程睡醒了,再开启t2,如果票少的话,
刚想让t2卖票,就会发现票已经让t1卖完了{:soso_e127:}
回复 使用道具 举报
           。。。。。。。。。。。。。。。。。。。。。飘过。
回复 使用道具 举报
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马