日期:2014-05-20  浏览次数:20696 次

一个死锁的问题
下列代码无法实现死锁,我的程序运行还是会正确执行完。
Java code


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();
    }
}



------解决方案--------------------
因为你的锁最终都会释放,当然不会死锁,错序死锁不是这样的:

Java code

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 楼的,LZ你的代码,把第二个sychronized 放在外面,这样的话,就不是用sychronized code(同步代码块),用sychronized method(同步函数)来解决,我们平常,写代码,是为了不让其死锁!
------解决方案--------------------
探讨

那我的代码怎样改就死锁了,我分析的结果是会死锁啊。

------解决方案--------------------
探讨

那我的代码怎样改就死锁了,我分析的结果是会死锁啊。

------解决方案--------------------
在java的学海里面,有着很多的东西,耐人寻味,引人入胜。
我在java里也工作3个年头了,不过我觉得自己学的东西仿佛只是java的冰山一角。
现在一直边工作边学习,在工作的过程中,学会了很多东西,这些都是在书上,在教程当中所学习不到的,特别在项目开发当中的话,觉得"交流"特别重要,不管你个人技术水平有多高,不管你个人全能否,都不外乎需要"交流"。
Struts1,Struts2,Spring,Hibernate,EJB,Ibabtis等项目经常需要用的框架,我们或者对其已经熟悉的不能再熟悉了,不过,在此又有个很大的弊端,有些工作了些许年的程序员,现在还依旧只知道这些框架怎么去用,但是不知道为什么可以这样去用。说一次我面试的经历,今天老大喊我帮忙去面试个人,我看了下来面试的人的简历,一看工作时间竟然有10年? 我但是心里一颤抖,尽然我这个刚工作3年面试一个10年经验的。。。不过,后面开始面试了,我也稍许淡定了些,不为什么,就因为我觉得对面的10年工作程序员也不过如此。因为,我问了他关于框架的东西,他无所不知,问他一个问题,他可以回答我3个出来,但是我一问java基础,反射,代理模式,单例模式,和这些框架一些底层实现的方法之类的,他竟然像个孩子一样无助的看着我。。。
我回去之后想了很多,10年的工作经验在开发生涯当中,已经算是"白骨精"(白领,骨干,精英)的境界了,可能说早已经成为管理层的一员了。不过,这位,还依旧在找着编码工作,我并不是有其他的想法,而是我觉得,在很多时候,一件事物的存在时有很多原因的,多方面去关注才能看清楚事物的本质。所以,我想到的就是为什么会这样?第一个,很简单很明显的就是,在工作中,还需要继续的学习。我记得我的以前的老大和我说过一个故事。