如何实现java的死锁

转帖|其它|编辑:郝浩|2008-11-25 14:17:01.000|阅读 1403 次

概述:如何实现java的死锁

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

第一段代码:没有实现死锁

public class TestDeadLock {
    public static void main(String[]args){
        LockThread  lt1=new LockThread();
        LockThread  lt2=new LockThread();
        lt2.setFlag(0);
        Thread     T1=new Thread(lt1);
        Thread      T2=new Thread(lt2);
        T1.start();
        T2.start();
    }
}
class LockThread  implements Runnable{
    private int flag=1;
    static Object o1=new Object();
    static Object o2=new Object();
    public void setFlag(int _flag){
        this.flag=_flag;
    }
    public void run(){
        System.out.println("flag=="+flag);
        if(flag==1){
            synchronized(o1){
                try{
                System.out.println("已经锁住第一个对象ddd");
                Thread.sleep(1000);
                }
                catch(InterruptedException e){
                   
                }
            }
            synchronized(o2){
                try{
                    System.out.println("已经锁住第二个对象");
                    Thread.sleep(100);
                    }
                    catch(InterruptedException e){
                       
                    }
            }
        }
        if(flag==0){
            synchronized(o2){
                try{
                System.out.println("已经锁住第二个对象ddd");
                Thread.sleep(1000);
                }
                catch(InterruptedException e){
                   
                }
            }
            synchronized(o1){
                try{
                    System.out.println("已经锁住第一个对象");
                    Thread.sleep(100);
                    }
                    catch(InterruptedException e){
                       
                    }
            }
        }
    }
}
第二段代码:实现了死锁

public class TestDeadLock {
public static void main(String[]args){
    LockThread  lt1=new LockThread();
    LockThread  lt2=new LockThread();
    lt2.setFlag(0);
    Thread     T1=new Thread(lt1);
    Thread      T2=new Thread(lt2);
    T1.start();
    T2.start();
}
}
class LockThread  implements Runnable{
    private int flag=1;
    static Object o1=new Object();
    static Object o2=new Object();
    public void setFlag(int _flag){
        this.flag=_flag;
    }
    public void run(){
        System.out.println("flag=="+flag);
        if(flag==1){
            synchronized(o1){
                try{
                System.out.println("已经锁住第一个对象ddd");
                Thread.sleep(1000);
                }
                catch(InterruptedException e){
                   
                }
                synchronized(o2){
                    try{
                        System.out.println("已经锁住第二个对象");
                        Thread.sleep(100);
                        }
                        catch(InterruptedException e){
                           
                        }
                }
            }
        }
        if(flag==0){
            synchronized(o2){
                try{
                System.out.println("已经锁住第二个对象ddd");
                Thread.sleep(1000);
                }
                catch(InterruptedException e){
                
  

                }
                synchronized(o1){
                    try{
                        System.out.println("已经锁住第一个对象");
                        Thread.sleep(100);
                        }
                        catch(InterruptedException e){
                           
                        }
                }
            }
        }
    }
}

总结:

这段实现死锁的代码必须得是得到一个对象锁再请求第二个对象锁的情况下,两个线程都拿着对方的对象锁,导致死锁。注意第二段代码的实现,是在锁里边套着请求第二个锁。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:DIY部落

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP