黑马程序员技术交流社区

标题: 写死锁,同步代码块内调用的对象问题 [打印本页]

作者: daoyua    时间: 2014-1-9 23:28
标题: 写死锁,同步代码块内调用的对象问题
本帖最后由 daoyua 于 2014-1-10 16:28 编辑

class Demo implements Runnable
{
        int i;
        Demo(int i){this.i=i;System.out.println(this.i);}
        
        Object c=new Object();
        Object d=new Object();

        public   void run(){
                if(i==1)
                {
                        synchronized(c)
                        {
                                System.out.println("IFA");//try{Thread.sleep(10);}catch(Exception e){}
                                synchronized(d)
                                {
                                        System.out.println("IFB");
                                }
                        }
                }
                else
                {
                        synchronized(d)
                        {
                                System.out.println("ELSEA");
                                synchronized(c)
                                {
                                        System.out.println("ELSEB");
                                }
                        }
                }

        }
}
class Suo
{
        static Object a=new Object();
        static Object b=new Object();
}
class Test  
{
        public static void main(String args[])
        {
               
                Thread t1=new Thread(new Demo(1));
                Thread t2=new Thread(new Demo(2));
               
                t1.start();
                t2.start();
        }
}
输出结果全部打印了,为什么不是死锁
如果把同步代码块对象换成Suo.a和Suo.b就是死锁了,不懂原因
作者: ixiangfeng    时间: 2014-1-10 00:10
你new了两个Demo 所有有两个c 和两个d 而Suo.a和Suo.b各有一个 如果你要用c和d的话就把它们都定义成static 这样应该没问题了
作者: wodenhaowzg    时间: 2014-1-10 04:13
没有成死锁,原因肯定是用的锁不是同一把。
你在主函数中new出两个线程,并且每个线程中 又各自new了两个Object对象,创建了c和d两个变量去引用这两个对象,很明显这两个线程用的锁根本不一样,等于两个线程各自用各自的锁来开锁。
而用static修饰后,意味着它为该类的所有实例所共享,保证了唯一性。
所以调用Suo.a和Suo.b能成功






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