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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ying 中级黑马   /  2013-1-6 21:45  /  1697 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ying 于 2013-1-8 13:15 编辑

我的这个程序使用了同步函数和同步代码块,为啥还打印出0呢?
  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.                         this.flag = false;
  13.                         synchronized(obj)
  14.                         {
  15.                                 if(tick > 0)
  16.                                 {
  17.                                         try{
  18.                                 Thread.sleep(100);
  19.                                 }catch(Exception e)
  20.                                 {
  21.                                 }
  22.                                 System.out.println(Thread.currentThread().getName() + "   code.... " + tick-- );
  23.                                 
  24.                                 }
  25.                         }
  26.                         
  27.                 }
  28.                 }
  29.                 else
  30.                         while(true)
  31.                         show();

  32.         }
  33.         public synchronized void show()
  34.         {

  35.                         if(tick>0)
  36.                         {
  37.                         
  38.                                 try{
  39.                                 Thread.sleep(100);
  40.                                 }catch(Exception e)
  41.                                 {
  42.                                 }
  43.                                 System.out.println(Thread.currentThread().getName() + "   show.... " + tick-- );
  44.                                 
  45.                         }
  46.         }
  47. }
  48. class TicketDemo2
  49. {
  50.         public static void main(String[] args)
  51.         {
  52.                 Ticket t = new Ticket();
  53.                
  54.                 Thread t1 = new Thread(t); //创建一个线程
  55.                 Thread t2 = new Thread(t); //创建一个线程

  56.                 t1.start();
  57.                 t2.start();
  58.         }
  59. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

4 个回复

倒序浏览
  1. package demo1;
  2. class Ticket implements Runnable
  3. {
  4.         private int tick = 100;

  5.         Object obj = new Object();
  6.         boolean flag = true;

  7.         public void run()
  8.         {
  9.                 if(flag)
  10.                 {
  11.                         while(true)
  12.                         {
  13.                         this.flag = false;
  14.                         synchronized([color=Red]obj[/color])
  15.                         {
  16.                             if(tick > 0)
  17.                             {
  18.                                     try{
  19.                                     Thread.sleep(100);
  20.                                     }catch(Exception e)
  21.                                     {
  22.                                     }
  23.                                     System.out.println(Thread.currentThread().getName() + "   code.... " + tick-- );
  24.                            
  25.                             }
  26.                         }
  27.                         }
  28.                 }
  29.                 else
  30.                         while(true)
  31.                         show();

  32.         }
  33.         public [color=Red]synchronized[/color] void show()
  34.         {

  35.                         if(tick>0)
  36.                         {
  37.                         
  38.                                 try{
  39.                                 Thread.sleep(100);
  40.                                 }catch(Exception e)
  41.                                 {
  42.                                 }
  43.                                 System.out.println(Thread.currentThread().getName() + "   show.... " + tick-- );
  44.                                 
  45.                         }
  46.         }
  47. }
  48. class TicketDemo2
  49. {
  50.         public static void main(String[] args)
  51.         {
  52.                 Ticket t = new Ticket();
  53.                
  54.                 Thread t1 = new Thread(t); //创建一个线程
  55.                 Thread t2 = new Thread(t); //创建一个线程

  56.                 t1.start();
  57.                 t2.start();
  58.         }
  59. }
复制代码
用的不是同一个锁,方法同步用的this,而同步代码块用的却是obj,所以打出了0

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
当线程运行到sleep(100)时,该线程已经获得了这时的tick,这时该线程sleep释放了当前线程,开始执行另一个线程,当sleep完成后继续执行没有执行完的代码。等到倒数第二个线程时,获得了tick=1,开始sleep,这时最后一个线程判断tick仍然等于1,就开始执行并sleep,这时倒数第二个线程结束sleep,执行tick--,等到最后一个线程结束sleep后,获得的tick就是0了,所以打印出来的是0。
这段代码的while是个死循环,应该在if(tick>0)为假时,跳出这个while循环
回复 使用道具 举报
synchronized的锁用的是 obj   同步函数用的是 this  用的锁不同 要实现同步需实现2个步骤:1至少2个线程以上;2需要同一把锁
回复 使用道具 举报
嗯! 多谢诸位!:handshake
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马