黑马程序员技术交流社区

标题: 这个锁为什么要加载run方法内加方法上不行吗,这样节省... [打印本页]

作者: 靓仔    时间: 2014-2-19 22:34
标题: 这个锁为什么要加载run方法内加方法上不行吗,这样节省...
本帖最后由 靓仔 于 2014-2-20 08:11 编辑

class Ticket implements Runnable
{
        private  int ticket = 100;
        Object obj=new Object();
        public void run()
        {
                while(true)
                {
                        synchronized(obj)
                        {
                                if(ticket>0)
                                {
                                        try{Thread.sleep(100);}catch (Exception e){}
                                        System.out.println(Thread.currentThread().getName()+"sale ticket"+ticket--);
                                }
                        }
                }
        }
}
class  ThreadSafe
{
        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();

        }
}
作者: 一年_Hei    时间: 2014-2-19 22:42
run方法还没试过,我感觉应该不可以。因为run方法是父类或接口的。这里是实现run方法。如果在方法上加了synchronized就不知道是不是重写run方法了。不知道我说的对不对。楼主可以自己试下
作者: 北冥有鱼    时间: 2014-2-19 23:38
我测试了一下,个人意见是这样的:将synchronized 写到run方法上会导致run方法被锁定。故只有线程thread-0一直去执行循环。也就是说其他的及格线程无法开启。
作者: 松涛小玮    时间: 2014-2-19 23:43
将run方法同步之后,就接近于单线程了,其它线程是执行不到,必须等当前线程结束完,其它线程才执行。这样执行效率低下。同步是尽量只对共同资源来同步,来提高效率。个人理解




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