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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 山里孩子 中级黑马   /  2015-3-22 17:50  /  1083 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 山里孩子 于 2015-3-23 23:43 编辑

在下面程序中,正确是两个都执行,但是试的话只执行线程1,不执行线程2.  
使用jdk1.8
老师演示的两个都执行
毕老师视频 :同步函数的锁是this

  1. class Ticket implements Runnable
  2. {
  3.         
  4.         public int ticket = 100;

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

  7.         public void run()
  8.         {
  9.                 //使用第一种方法
  10.                 if ( flag )
  11.                 {
  12.                         synchronized(this)
  13.                         {
  14.                                 while ( ticket > 0 )
  15.                                 {
  16.                                         try{Thread.sleep(10);
  17.                                                 }catch(Exception e){}//异常处理
  18.                                         System.out.println(Thread.currentThread().getName()+"  sales: ....."+ticket--);
  19.                                 }
  20.                         }
  21.                 }
  22.                 else
  23.                         show();
  24.         }
  25.         //使用第二种方法调用
  26.         public synchronized void show()
  27.         {
  28.                 while ( ticket > 0 )
  29.                 {
  30.                         try{Thread.sleep(10);
  31.                                 }catch(Exception e){}//异常处理
  32.                         System.out.println(Thread.currentThread().getName()+"  sales:"+ticket--);
  33.                 }
  34.         }
  35. }


  36. class ThreadDemo4
  37. {
  38.         public static void main(String[] args)
  39.         {
  40.                 Ticket t = new Ticket();

  41.                 Thread t1 = new Thread(t);
  42.                 Thread t2 = new Thread(t);

  43.                 t1.start();
  44.                
  45.                 try
  46.                 {
  47.                         Thread.sleep(10);
  48.                 }
  49.                 catch ( Exception e )
  50.                 {
  51.                 }
  52.                
  53.                 t.flag = false;
  54.                 t2.start();

  55.         }
  56. }
复制代码





6 个回复

倒序浏览
因为线程1进去后,关闭锁,然后进入循环,循环完一次后,直接开始循环第二次,并没有出同步,一直是锁上的,他在循环里一顿疯狂执行,执行完后,才出了同步,因此线程2一直被锁在了外面,,线程2一直没有执行权
回复 使用道具 举报
殷俊 发表于 2015-3-22 18:07
因为线程1进去后,关闭锁,然后进入循环,循环完一次后,直接开始循环第二次,并没有出同步,一直是锁上的 ...

那这段代码怎么改两个线程都会执行?
视频里这样 会两个都执行的
回复 使用道具 举报
class Ticket implements Runnable
{
        
        public int ticket = 100;

        Object obj = new Object();
        boolean flag = true;

        public void run()
        {
                //使用第一种方法
                if ( flag )
                {
                    while ( ticket > 0 )
                    {
                                                                         synchronized(this)
                                                                        {       
                                        try{Thread.sleep(10);
                                                }catch(Exception e){}//异常处理
                                        System.out.println(Thread.currentThread().getName()+"  sales: ....."+ticket--);
                                                                        }
                    }
                }
                else
                                        while(ticket>0)
                        show();
        }
        //使用第二种方法调用
        public synchronized void show()
        {
                while ( ticket > 0 )
                {
                        try{Thread.sleep(10);
                                }catch(Exception e){}//异常处理
                        System.out.println(Thread.currentThread().getName()+"  sales:"+ticket--);
                }
        }
}


class ThreadDemo4
{
        public static void main(String[] args)
        {
                Ticket t = new Ticket();

                Thread t1 = new Thread(t);
                Thread t2 = new Thread(t);

                t1.start();
               
                try
                {
                        Thread.sleep(10);
                }
                catch ( Exception e )
                {
                }
               
                t.flag = false;
                t2.start();

        }
}
这样就好,把同步放在循环里面
回复 使用道具 举报
殷俊 发表于 2015-3-22 18:42
class Ticket implements Runnable
{
        

你好.还是不行呃.   只执行show方法里边的
回复 使用道具 举报
山里孩子 发表于 2015-3-22 19:45
你好.还是不行呃.   只执行show方法里边的

因为ticket取的有点小,在show方法里面一下就执行完了,你改成1000就能看到了
回复 使用道具 举报
殷俊 发表于 2015-3-22 19:54
因为ticket取的有点小,在show方法里面一下就执行完了,你改成1000就能看到了 ...

可以了.现在执行就是  先执行每1个再执行show里边的.
谢谢啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马