出现死锁的情况
线程t1拿到锁因为一些异常没有释放锁,线程t1和t2互相等待对方释放锁。
public class DeadLockDemo {
private static String A="A";
private static String B="B";
public static void main(String[] args) {
new DeadLockDemo().deadLock();
}
private void deadLock(){
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
synchronized (A){
try {
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (B){
System.out.println("1");
}
}
}
});
Thread t2=new Thread(new Runnable() {
@Override
public void run() {
synchronized (B){
synchronized (A){
System.out.println("2");
}
}
}
});
t1.start();
t2.start();
}
}
避免死锁的常见方法
- 避免一个线程同时获取多个锁。
- 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用同一个资源。
- 尝试使用定时锁,使用lock.tryLock(timout)来替代使用内部锁机制。
- 对于数据库锁,加锁和解锁必须在同一个数据库里,否则会出现解锁失败的情况。