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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 337091921 中级黑马   /  2013-5-12 03:00  /  1183 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 337091921 于 2013-5-12 18:27 编辑

为什么创建对象的位置不同,锁就不同啊。输出结果更不同啊?
class test
{
        public static void main(String args [])
        {
                tic ti=new tic();
                //tic tii=new tic();
                Thread t=new Thread(ti,"线程一");
                Thread t1=new Thread(ti,"线程二");
                Thread t2=new Thread(ti,"线程三");
                Thread t3=new Thread(ti,"线程四");
          t.start();        
          t1.start();        
          t2.start();        
          t3.start();        
        
        }
}
class tic implements Runnable
{
                private  int num=100;
               
                objectt  obj =new object();//为什么要放这啊,放下面就不可以呢?
                public void  run(){
        
                    //objectt  obj =new object();
                while(true){
                    synchronized (obj){
        
                        if(num>0){
                                try
                                {Thread.sleep(10);
                                       
                                }
                                catch (Exception e)
                                {
                                }
                                
                                System.out.println(Thread.currentThread().getName()+" ======="+num--);
                        }
                        }
        
                }
        
        }
}

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

5 个回复

倒序浏览
首先,不论是同步代码块还是同步方法,都会损失一些效率,所以应该根据线程可能出现问题的地方加上同步。所以,同步里的代码越少越好。
其次,Object obj=new Object();这本来就是用任意一个对象来加锁的,所以只要有一个对象就行了,放下面的话,这不是每执行一次run()方法,都会创建一个对象了,没这个必要。
至于你说输出结果不同,这个很正常啊,可能每次的输出结果都不同的啊,本来就是看他们谁运气好,能显得到锁并得到cpu。

点评

回答的不错。  发表于 2013-5-12 10:06

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

回复 使用道具 举报
如果你放在run方法里面就会不止一个obj了,那就不是唯一的了,你又怎么可能实现同步呢!!
回复 使用道具 举报
我也不是很清楚,希望有人解决…  学习下…
回复 使用道具 举报
输出结果不同,这个看运气的。。。和多线程代码没有什么必然的联系。
你的tic类实现了Runnable接口,也是说你的四个线程执行的是同一个对象。
你的obj如果放在了run方法里面就是成为另一个零时变量。就会不会实现你想要的结果了。
如果放在里面了可能你会打出四个2出来或许其他情况。

多线程同享资源时,一定要把锁设置成共享的。如果你把obj放到run里面,obj就不会共享了。就会出问题。

位置放在那个地方不重要,共享才是重要的。
回复 使用道具 举报
楼主记得即使结贴哦!不明白可以继续提问。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马