黑马程序员技术交流社区

标题: 同步线程的锁,真把我搞晕了。 [打印本页]

作者: 337091921    时间: 2013-5-12 03:00
标题: 同步线程的锁,真把我搞晕了。
本帖最后由 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--);
                        }
                        }
        
                }
        
        }
}
作者: 白磊    时间: 2013-5-12 08:00
首先,不论是同步代码块还是同步方法,都会损失一些效率,所以应该根据线程可能出现问题的地方加上同步。所以,同步里的代码越少越好。
其次,Object obj=new Object();这本来就是用任意一个对象来加锁的,所以只要有一个对象就行了,放下面的话,这不是每执行一次run()方法,都会创建一个对象了,没这个必要。
至于你说输出结果不同,这个很正常啊,可能每次的输出结果都不同的啊,本来就是看他们谁运气好,能显得到锁并得到cpu。
作者: 江南雨    时间: 2013-5-12 08:18
如果你放在run方法里面就会不止一个obj了,那就不是唯一的了,你又怎么可能实现同步呢!!
作者: Oyxiaoxi    时间: 2013-5-12 09:31
我也不是很清楚,希望有人解决…  学习下…
作者: 刘胜寒    时间: 2013-5-12 10:10
输出结果不同,这个看运气的。。。和多线程代码没有什么必然的联系。
你的tic类实现了Runnable接口,也是说你的四个线程执行的是同一个对象。
你的obj如果放在了run方法里面就是成为另一个零时变量。就会不会实现你想要的结果了。
如果放在里面了可能你会打出四个2出来或许其他情况。

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

位置放在那个地方不重要,共享才是重要的。
作者: 刘胜寒    时间: 2013-5-12 10:12
楼主记得即使结贴哦!不明白可以继续提问。




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