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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 靓仔 于 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();

        }
}

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

3 个回复

正序浏览
将run方法同步之后,就接近于单线程了,其它线程是执行不到,必须等当前线程结束完,其它线程才执行。这样执行效率低下。同步是尽量只对共同资源来同步,来提高效率。个人理解
回复 使用道具 举报
我测试了一下,个人意见是这样的:将synchronized 写到run方法上会导致run方法被锁定。故只有线程thread-0一直去执行循环。也就是说其他的及格线程无法开启。
回复 使用道具 举报
一年_Hei 来自手机 中级黑马 2014-2-19 22:42:37
沙发
run方法还没试过,我感觉应该不可以。因为run方法是父类或接口的。这里是实现run方法。如果在方法上加了synchronized就不知道是不是重写run方法了。不知道我说的对不对。楼主可以自己试下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马