黑马程序员技术交流社区

标题: 关于多线程的安全问题 [打印本页]

作者: 樊鹏飞    时间: 2012-10-3 10:50
标题: 关于多线程的安全问题
本帖最后由 樊鹏飞 于 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张票。求解决。
作者: 樊鹏飞    时间: 2012-10-3 10:57
本帖最后由 樊鹏飞 于 2012-10-3 11:04 编辑

好像有点问题。
追问一下:是否像这样只有线程0在执行,或者线程0,线程2,线程3在执行这100张票,而线程1没有参与执行的情况也是可能出现的,如果是,求教为什么会出现这样的情况?

作者: 高照    时间: 2012-10-3 11:29
我运行了一下,没发现任何错误。
synchronized(obj)

              {

                      if(tick>0)

                {

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

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

                }

              }


作者: 樊鹏飞    时间: 2012-10-3 12:04
高照 发表于 2012-10-3 11:29
我运行了一下,没发现任何错误。
synchronized(obj)

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

你好,你说的这个方法不行,就算加了synchronized,控制台上还是会打印出0,-1,-2,还是存在安全问题。还有tick=100是共享资源,按照毕老师的讲解,共享资源是要放到同步代码块中的。还是谢谢你的解答。
作者: 李润根    时间: 2012-10-3 12:39
我跑了一下,没问题啊,你PC的问题吧~~~


作者: 武庆东    时间: 2012-10-3 12:40
樊鹏飞 发表于 2012-10-3 12:11
你好,你说的这个方法不行,就算加了synchronized,控制台上还是会打印出0,-1,-2,还是存在安全问题。 ...

是我的错了,应该是sleep问题,你实际改为1000试试
作者: 樊鹏飞    时间: 2012-10-3 22:58
谢谢大家 问题已解决




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