死锁的原因:
两个或以上线程,相互抢占对方持有的锁,导致相互等待
典型死锁程序:
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转帐,都先对自己账户加锁,导致死锁,应该怎样处理?