java线程死锁问题

死锁的原因:

 两个或以上线程,相互抢占对方持有的锁,导致相互等待

典型死锁程序:

public class DeadLockDemo {
    private final static  Object lock1 = new Object();
    private final static  String lock2 = new String();

    public static void main(String[] args) throws Exception{
        newThread("ThreadA",lock1,lock2).start();
        newThread("ThreadB",lock2,lock1).start();
    }
    private static Thread newThread(final String threadName, final Object lock1, final Object lock2){
        return new Thread(()->{
            synchronized (lock1){
                System.out.println(threadName+ "holding first lock");
                try{
                    Thread.sleep(3000l);
                }catch (Exception e){
                    e.printStackTrace();
                }
                System.out.println(threadName+ "waiting second lock");
                synchronized (lock2){
                    System.out.println(threadName+ "holding second lock");
                }
            }
        },threadName);
    }
}

线程1和2对着两把锁加锁,但是加的顺序不一样,导致相互等待

死锁的检测:

jstack堆栈会有死锁相关的打印

避免死锁的方法:

1、保证所有线程获取锁的顺序是一样的,比如全部都先获取第一把锁,再去获取第二把锁

2、用有超时功能的方法获取锁,tryLock

问题:

银行转账,A向B转帐,B向A转帐,都先对自己账户加锁,导致死锁,应该怎样处理?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值