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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 郑文博 于 2012-6-23 20:09 编辑
  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.         }
  57. }
复制代码
一共两个疑问。
问题其一,第59行语句不加时,由于主线程很快的执行了后面两句代码,所以常有t2线程把所有的100张票卖掉了。而加上了第59行代码后,人为的给该线程做了休眠处理,是否会只有t1线程把所有票都自己卖光的情况呢?
问题其二,今天的课程学习发现所有的程序都有第23行的语句,自己苦思不明白这句话的意义所在,非常郁闷,求高人指点。

--------------------------编辑后分隔-----------------------------
非常感谢!

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
本帖最后由 薄炳鑫 于 2012-6-23 11:44 编辑

第一个问题:
肯定会有的,一开始由于t2休眠,就先由t1执行,当t2醒后没有抢到执行资格就继续由t1执行,t2又在休眠,循环这样判断这样就会出现一直由t1 将票卖完的情况。
第二个问题:
那个while(true)循环就是控制一直卖票的循环,让ticket--.

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
薄炳鑫 发表于 2012-6-23 11:35
第一个问题:
肯定会有的,一开始由于t2休眠,就先由t1执行,当t2醒后没有抢到执行资格就继续由t1执行,t2 ...

呃 我发现自己的二个问题好白痴啊 还想半天。。。
第一个问题中你说的“当t2醒后没有抢到执行资格就继续由t1执行,t2又在休眠。” t2会继续休眠吗?
回复 使用道具 举报
郑文博 发表于 2012-6-23 11:54
呃 我发现自己的二个问题好白痴啊 还想半天。。。
第一个问题中你说的“当t2醒后没有抢到执行资格就继续 ...

那里是在等待,写错了。这个过程是我自己的理解。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马