- 为什么会出现死锁:
线程T1去拿资源A导致A资源被锁然后再去拿B资源,然而此时线程T2已经拿到B资源且此时正准备去拿A资源,这样就导致死锁出现。 - 避免死锁的方式:
既然可能产生死锁,那么接下来,讲一下如何避免死锁。
1、让程序每次至多只能获得一个锁。当然,在多线程环境下,这种情况通常并不现实
2、设计时考虑清楚锁的顺序,尽量减少嵌在的加锁交互数量
3、既然死锁的产生是两个线程无限等待对方持有的锁,那么只要等待时间有个上限不就好了。当然synchronized不具备这个功能,但是我们可以使用Lock类中的tryLock方法去尝试获取锁,这个方法可以指定一个超时时限,在等待超过该时限之后变回返回一个失败信息
-
死锁的简单例子:
public class DeadLock {
public static Object a = new Object();
public static Object b = new Object();
public static void main(String[] args) {
new Thread(() -> {
try {
synchronized (a) {
System.out.println("lock a");
TimeUnit.SECONDS.sleep(3);
synchronized (b) {
System.out.println("lock b");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
try {
synchronized (b) {
System.out.println("lock b");
TimeUnit.SECONDS.sleep(3);
synchronized (a) {
System.out.println("lock a");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}