死锁的例子以及解决办法

给个死锁的例子:

public class TestDeadLock implements Runnable{
    public int flag = 0;
    static Object o1 = new Object();
    static Object o2 = new Object();
    @Override
    public void run() {
        if(flag == 0){
            synchronized (o1){
                System.out.println("flag=0获取Object1的锁");
                try{
                    Thread.sleep(1000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                synchronized (o2){
                    System.out.println("flag=0获取Object2的锁");
                }
            }
        }
        if(flag == 1){
            synchronized (o2){
                System.out.println("flag=1获取Object2的锁");
                try{
                    Thread.sleep(1000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                synchronized (o1){
                    System.out.println("flag=1获取Object1的锁");
                }
            }
        }
    }
    public static void main(String[] args) {
        TestDeadLock td1 = new TestDeadLock();
        TestDeadLock td2 = new TestDeadLock();
        td1.flag = 0;
        td2.flag = 1;
        new Thread(td1).start();
        new Thread(td2).start();
    }
}

Object1和Object2定为static,保证实例只有一份:

输出结果:(产生死锁)

flag=0获取Object1的锁
flag=1获取Object2的锁
。。。。。(程序发生死锁)

上诉代码经过以下修改可以避免死锁的发生:

public class TestDeadLock implements Runnable{
    public int flag = 0;
    static Object o1 = new Object();
    static Object o2 = new Object();
    @Override
    public void run() {
        if(flag == 0){
            synchronized (o1){
                System.out.println("flag=0获取Object1的锁");
                try{
                    Thread.sleep(1000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
            synchronized (o2){
                System.out.println("flag=0获取Object2的锁");
            }
        }
        if(flag == 1){
            synchronized (o2){
                System.out.println("flag=1获取Object2的锁");
                try{
                    Thread.sleep(1000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
            synchronized (o1){
                System.out.println("flag=1获取Object1的锁");
            }
        }
    }
    public static void main(String[] args) {
        TestDeadLock td1 = new TestDeadLock();
        TestDeadLock td2 = new TestDeadLock();
        td1.flag = 0;
        td2.flag = 1;
        new Thread(td1).start();
        new Thread(td2).start();
    }
}
输出结果:

flag=0获取Object1的锁
flag=1获取Object2的锁
flag=1获取Object1的锁
flag=0获取Object2的锁

避免死锁的方法:

(1)上述demo最常见,在占有一个资源的时候继续申请占有另外一个资源,这种情况下在其他线程试图申请前一个线程占有的资源时容易发生死锁。避免嵌套申请锁

(2)还有一些方法:

  • 加锁顺序(线程按照一定的顺序加锁)
  • 加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)
  • 死锁检测

参考博客:http://blog.csdn.net/ls5718/article/details/51896159


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值