死锁的4个必要条件
- 互斥条件:资源不能共享,只能由一个线程使用
- 请求与保持条件:线程已经获得一些资源,但因请求其他资源发生阻塞,对已经获得的资源保持不释放
- 不可抢占:有些资源是不可强占的,当某个线程获得这个资源后,系统不能强行回收,只能由线程使用完自己释放
- 循环等待条件:多个线程形成环形链,每个都占用对方申请的下个资源
只要发生死锁,上面的条件都成立;只要一个不满足,就不会发生死锁
package lock;
/**
* 死锁的4个必要条件
* 互斥条件:资源不能共享,只能由一个线程使用
* 请求与保持条件:线程已经获得一些资源,但因请求其他资源发生阻塞,对已经获得的资源保持不释放
* 不可抢占:有些资源是不可强占的,当某个线程获得这个资源后,系统不能强行回收,只能由线程使用完自己释放
* 循环等待条件:多个线程形成环形链,每个都占用对方申请的下个资源
* 只要发生死锁,上面的条件都成立;只要一个不满足,就不会发生死锁
*/
public class DieLockDemo {
private static final String lockA = "lockA";
private static final String lockB = "lockB";
public void methodA() {
synchronized (lockA) {
System.out.println("方法A获取锁A" + lockA);
synchronized (lockB) {
System.out.println("方法A获取锁A" + lockB);
}
}
}
public void methodB() {
synchronized (lockB) {
System.out.println("方法B获取锁B" + lockB);
synchronized (lockA) {
System.out.println("方法B获取锁A" + lockA);
}
}
}
public static void main(String[] args) {
DieLockDemo dieLockDemo = new DieLockDemo();
for (int i = 0; i < 5; i++) {
new Thread(dieLockDemo::methodA).start();
new Thread(dieLockDemo::methodB).start();
}
}
}