下列代码无法实现死锁,我的程序运行还是会正确执行完。
public class TestDeadLock implements Runnable{
public int flag = 2;
static Object o1 = new Object();
static Object o2 = new Object();

public void run(){
if(flag == 1){
synchronized(o1){
System.out.println("锁住o1");
try {
Thread.sleep(5000);
}catch(Exception e){}
}

synchronized(o2){
System.out.println("1");
}
}
//疑问:无法死锁
if(flag == 0){
synchronized(o2){
System.out.println("锁住o2");
try {
Thread.sleep(5000);
}catch(Exception e){}
}

synchronized(o1){
System.out.println("2");
}
}
}

public static void main(String[] args){
TestDeadLock td1 = new TestDeadLock();
TestDeadLock td2 = new TestDeadLock();
td1.flag = 1;
td2.flag = 0;
Thread t1 = new Thread(td1);
Thread t2 = new Thread(td2);
t1.start();
t2.start();
}
}

解决方案 »

  1.   

    因为你的锁最终都会释放,当然不会死锁,错序死锁不是这样的:
    public class TestDeadLock implements Runnable{
        public int flag = 2;
        static Object o1 = new Object();
        static Object o2 = new Object();
        
        public void run(){
            if(flag == 1){
                synchronized(o1){
                    System.out.println("锁住o1");    
                    try {
                        Thread.sleep(5000);
                    }catch(Exception e){}

    synchronized(o2){
    System.out.println("1");
    }
                }
            }
            //疑问:无法死锁
            if(flag == 0){
                synchronized(o2){
                    System.out.println("锁住o2");
                    try {
                        Thread.sleep(5000);
                    }catch(Exception e){}

    synchronized(o1){
    System.out.println("2");
    }
                }
            }
        }
        
        public static void main(String[] args){
            TestDeadLock td1 = new TestDeadLock();
            TestDeadLock td2 = new TestDeadLock();
            td1.flag = 1;
            td2.flag = 0;
            Thread t1 = new Thread(td1);
            Thread t2 = new Thread(td2);
            t1.start();
            t2.start();
        }
    }
      

  2.   

    http://www.ticmy.com/?p=141
      

  3.   

    顶1 楼的,LZ你的代码,把第二个sychronized 放在外面,这样的话,就不是用sychronized code(同步代码块),用sychronized method(同步函数)来解决,我们平常,写代码,是为了不让其死锁!
      

  4.   


    1楼已经改的很清楚了
    synchronized(o1){
       .......
      synchronized(o2){
       }
       
    }
      

  5.   

        在java的学海里面,有着很多的东西,耐人寻味,引人入胜。
        我在java里也工作3个年头了,不过我觉得自己学的东西仿佛只是java的冰山一角。
    现在一直边工作边学习,在工作的过程中,学会了很多东西,这些都是在书上,在教程当中所学习不到的,特别在项目开发当中的话,觉得"交流"特别重要,不管你个人技术水平有多高,不管你个人全能否,都不外乎需要"交流"。
        Struts1,Struts2,Spring,Hibernate,EJB,Ibabtis等项目经常需要用的框架,我们或者对其已经熟悉的不能再熟悉了,不过,在此又有个很大的弊端,有些工作了些许年的程序员,现在还依旧只知道这些框架怎么去用,但是不知道为什么可以这样去用。说一次我面试的经历,今天老大喊我帮忙去面试个人,我看了下来面试的人的简历,一看工作时间竟然有10年? 我但是心里一颤抖,尽然我这个刚工作3年面试一个10年经验的不过,后面开始面试了,我也稍许淡定了些,不为什么,就因为我觉得对面的10年工作程序员也不过如此。因为,我问了他关于框架的东西,他无所不知,问他一个问题,他可以回答我3个出来,但是我一问java基础,反射,代理模式,单例模式,和这些框架一些底层实现的方法之类的,他竟然像个孩子一样无助的看着我
        我回去之后想了很多,10年的工作经验在开发生涯当中,已经算是"白骨精"(白领,骨干,精英)的境界了,可能说早已经成为管理层的一员了。不过,这位,还依旧在找着编码工作,我并不是有其他的想法,而是我觉得,在很多时候,一件事物的存在时有很多原因的,多方面去关注才能看清楚事物的本质。所以,我想到的就是为什么会这样?第一个,很简单很明显的就是,在工作中,还需要继续的学习。我记得我的以前的老大和我说过一个故事。
         有个面包师,在麦当劳工作了有3年了,每天重复着单一的工作内容,但是在刚开始的觉得过得还不错,因为在那个时候工资待遇不错,工作要求水平也不高,也就这么不错的过着。但是就只在第三年,他的工资依旧没有涨过,他一次和老板提加薪要求,但是被老板一口回绝,并说着:你做的事情每一个不懂的人只需要稍微学习下就行了,你不做自然有人会来做。后来一了解,麦当劳面包师不能说是面包师,而是烹饪师,因为一切的原料都已经做好了,他只需要把那些面包和汉堡之类的放微波炉中,油锅里面热一热,炸一炸就可以出炉了。后来,经人介绍,买下了一个小小的面包作坊,他可能说是自己也了解到自己为什么做了这么久的时间还得不到老板加薪,自己刻苦的钻研着怎么让自己的面包更让顾客喜欢,更吸引别人,后来也就凭着自己的努力,终于做好了自己的品牌,成功了。
         故事说了有点罗嗦,但是你看了之后应该会明白些什么,只有你成为了一个团队,一个生活圈不可或缺的人的时候,你才能活的自由,你才能获得你相应的报酬,如果你是那个获得或缺的人,那你的存在就显得不那么的重要,自然你就不会成为可以主宰的人。
        第二个,怎么继续学习?就像我前面说的,不能只图方便,只图着一时的轻松,周而复始的这么做的,就像说的这个框架你使用的不能再熟练了,但是你还是一样,只是知道怎么使用,但是一个框架的最主要的不是怎么去使用,而是懂得其底层的思想。就想你熟悉的java,如果再让你去学习C#语言,可能不会像你刚学习java的时候那么困难了吧?但是从中,我又想起了一点,不知道是人性的问点,还是个别人的问题。在学习的时候,坚持不了,只会做三分钟先生。包括我,有的时候也有这些看似没多大问题,其实很严重的问题。
       我很困扰,我真的很困扰自己该怎么解决这个问题,难道还请个人来一起学习自己才能学习的上心些么?因为自己在那个时候刚出来,心浮气躁的,根本来说静不下心来说去好好学习。后来由着朋友介绍了一些技术群,和大家一起讨论问题解决问题,我很享受这种感觉,和大家一起学习互相鼓励,后来也懂得一些做人,做事,做学问的方法和道理,就是一个人可能不那么强大,集所有人的力量一定能够解决看似很强大的bug.
        现在我经过了那段热血的但是及其浮躁的年代,现在我想把自己的一些经验告诉大家,而且我也想让大家能够在一起学习,而且是一起互帮互助学习,不管是在工作当中还是在学习,都得明白和大家多交流,一起多学习,而且对于别人的建议和推荐一定要好好考虑!
        我在很多技术论坛都学习过,不过我觉得在很多论坛中学习的资料是很多,但是在某些方面来说的话,并不是很适合每一个人,我觉得在很多时候有想学的但是没有肯教的,所以我想有个能让每一个人都有学的地方就好了,因为在群里聊天的话也只能不太固定的教些东西,而且也不能让所有人参与进来。所以我自己弄了个论坛,www.90cxy.com 90程序员,刚刚起步,不为了名,不为了利,只想有个可以和很多人一起学习的平台,虽然不说很好,但是我想,可以让每个人都不至于空手而归。