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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张庚 中级黑马   /  2013-2-6 11:47  /  931 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Ticket implements Runnable//extends Thread
{
        private  int num = 100;

        Object obj = new Object();//这个对象锁放在里面和放在外面有什么区别 ,没怎么听清楚,求解释。。        
               public void run()
        {
                 //Object obj = new Object();
                while(true)
                {
                        synchronized(obj)
                        {
                                if(num>0)
                                {
                                        try{Thread.sleep(10);}catch (InterruptedException e){}
                                       
                                        System.out.println(Thread.currentThread().getName()+".....sale...."+num--);
                                }
                        }
                }
        }
}


class  TicketDemo
{
        public static void main(String[] args)
        {

                Ticket t = new Ticket();//创建一个线程任务对象。

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

                t1.start();
                t2.start();
                t3.start();
                t4.start();


                /*
                Ticket t1 = new Ticket();
//                Ticket t2 = new Ticket();
//                Ticket t3 = new Ticket();
//                Ticket t4 = new Ticket();

                t1.start();
                t1.start();//一个线程不能开启两次,会抛出无效线程状态异常
                t1.start();
                t1.start();
                */

               
        }
}

1 个回复

倒序浏览
说的简单一点就是对象锁放在外面的话,下面4个线程使用的话就是同一把锁,而放在里面的话,那就是4个线程各自有一把锁!
为什么?因为在里面的话,每一个抢到运行时间的线程都会new一个自己的Object对象锁,虽然都是Object的锁,对象名也一样,但实际却不一样,还是会出现线程安全问题!
但是如果放在外面的话,那这个对象锁就是共有的!4个线程就会同用这把锁,保证了线程的安全!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马