死锁产生的4个必要条件
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
满足以上4个条件的死锁的例子:
package com.cjy.concurrent;
class ThreadA extends Thread {
public void run() {
System.out.println("ThreadA");
Test.getLockB();
}
}
class ThreadB extends Thread {
public void run() {
System.out.println("ThreadB");
Test.getLockA();
}
}
public class Test {
public static Object lockA = new Object();
public static Object lockB = new Object();
public static void getLockA() {
synchronized (lockA) {
getLockB();
try {
System.out.println("get lockA");
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void getLockB() {
synchronized (lockB) {
getLockA();
try {
System.out.println("get lockA");
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ThreadA threadA = new ThreadA();
ThreadB threadB = new ThreadB();
((Thread) threadA).start();
((Thread) threadB).start();
}
}
测试结果如下:
at com.cjy.concurrent.Test.getLockB(Test.java:38)
at com.cjy.concurrent.Test.getLockA(Test.java:25)
at com.cjy.concurrent.Test.getLockB(Test.java:38)
at com.cjy.concurrent.Test.getLockA(Test.java:25)
at com.cjy.concurrent.Test.getLockB(Test.java:38)