举一个死锁的例子

        大家工作中或者面试的时候,会碰到死锁的问题,大家都听说过两个线程互相等待,从而导致等死(锁)的情况吧,就是线程1持有对象1的锁,线程2持有对象2的锁,然后两者都等待对方释放其持有对象的锁,然后一直等,等到死亡。但是听是都听过,若有人让你写个例子呢???

下面就举个例子:

public class DieLock {

    public static Object t1 = new Object();
    public static Object t2 = new Object();

    public static void main(String[] args){
        new Thread(){
            @Override
            public void run(){
                synchronized (t1){
                    System.out.println("Thread1 get t1");

                    try {
                        Thread.sleep(100);
                    }catch (Exception e){

                    }

                    synchronized (t2){
                        System.out.println("Thread2 get t2");
                    }
                }
            }
        }.start();

        new Thread(){
            @Override
            public void run(){
                synchronized (t2){
                    System.out.println("Thread2 get t2");

                    try {
                        Thread.sleep(100);
                    }catch (Exception e){

                    }

                    synchronized (t1){
                        System.out.println("Thread2 get t1");
                    }
                }
            }
        }.start();
    }
}

运行的结果如下:

 两者一直等待对方释放持有的锁,然后一直等到死亡。。。

中间加睡眠时间,是为了防止线程一运行就获得两个对象的锁。

如何避免死锁的产生呢???

下面给几个建议:

        避免一个线程同时获取多个锁;

        避免一个线程在锁内同时占据多个资源,尽量保证每个锁只占据一个资源;

        尝试使用定时锁,使用lock.tryLock(timeout)来代替使用内部锁机制;

        对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值