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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 樊鹏飞 中级黑马   /  2012-10-3 10:50  /  1853 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 樊鹏飞 于 2012-10-3 22:58 编辑

毕老师视频中的源代码:
  1. class Ticket implements Runnable
  2. {
  3.    private int tick = 100;
  4.    Object obj = new Object();
  5.    public void run()
  6.    {
  7.       while(true)
  8.       {
  9.               synchronized(obj)
  10.               {
  11.                       if(tick>0)
  12.                 {
  13.                          try{Thread.sleep(10);}catch(Exception e){}
  14.                          System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);
  15.                 }
  16.               }
  17.       }        
  18.    }        
  19. }


  20. class TicketDemo2
  21. {
  22.   public static void main(String[] args)
  23.   {
  24.              Ticket t = new Ticket();
  25.              Thread t1 = new Thread(t);
  26.              Thread t2 = new Thread(t);
  27.              Thread t3 = new Thread(t);
  28.              Thread t4 = new Thread(t);
  29.              t1.start();
  30.              t2.start();
  31.              t3.start();
  32.              t4.start();
  33.   }        
  34. }
复制代码
问题:
在代码中我未加synchronized代码之前,控制台上能够打印出0,-1,-2,但是加上同步代码之后,正常情况下是这4个线程都会去执行这100张票,但是无论我运行多少次,或者是改变sleep方法中的时间,控制台上打印出的结果都只有线程0在执行这100张票。求解决。

7 个回复

倒序浏览
本帖最后由 樊鹏飞 于 2012-10-3 11:04 编辑

好像有点问题。
追问一下:是否像这样只有线程0在执行,或者线程0,线程2,线程3在执行这100张票,而线程1没有参与执行的情况也是可能出现的,如果是,求教为什么会出现这样的情况?
回复 使用道具 举报
我运行了一下,没发现任何错误。
synchronized(obj)

              {

                      if(tick>0)

                {

                         try{Thread.sleep(10);}catch(Exception e){}//你这句话好像没什么用,因为你让当前线程暂停一下,
                                                         //但你已经加了锁,别的线程是进不来的,正个程序都在等待,
                                                        //加这句话只是在浪费资源,但加不加这句程序都能正常运行

                         System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);

                }

              }

回复 使用道具 举报
高照 发表于 2012-10-3 11:29
我运行了一下,没发现任何错误。
synchronized(obj)

谢谢!可是线程不都是抢占资源的吗?用sleep方法只是让当前线程睡一下,其他线程不还是可以抢占的吗。还有,补充一下,这个代码是毕老师视频中的源代码。
回复 使用道具 举报
武庆东 发表于 2012-10-3 11:46
问题:
在代码中我未加synchronized代码之前,控制台上能够打印出0,-1,-2,但是加上同步代码之后,正常 ...

你好,你说的这个方法不行,就算加了synchronized,控制台上还是会打印出0,-1,-2,还是存在安全问题。还有tick=100是共享资源,按照毕老师的讲解,共享资源是要放到同步代码块中的。还是谢谢你的解答。
回复 使用道具 举报
我跑了一下,没问题啊,你PC的问题吧~~~

回复 使用道具 举报
樊鹏飞 发表于 2012-10-3 12:11
你好,你说的这个方法不行,就算加了synchronized,控制台上还是会打印出0,-1,-2,还是存在安全问题。 ...

是我的错了,应该是sleep问题,你实际改为1000试试
回复 使用道具 举报
谢谢大家 问题已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马