模拟死锁的过程一:
public class T {
Object o1 = new Object();
Object o2 = new Object();
private void m1() {
synchronized (o1) {
System.out.println("锁住o1");
synchronized (o2) {
System.out.println("获取o2");
}
}
System.out.println("m1调用");
}
private void m2() {
synchronized (o2) {
System.out.println("锁住o2");
synchronized (o1) {
System.out.println("获取o1");
}
}
System.out.println("m2调用");
}
public static void main(String[] args) {
T t = new T();
new Thread(t::m1,"t1").start();
new Thread(t::m2,"t2").start();
}
}
该方法调用的过程可能会产生死锁
该死锁的方式为在m1调用的时候先获取o1资源然后获取o2资源,如果m2同时执行的时候o2被锁定,当m1在获取o1之后获取o2时,同时m2获取o2要获取o1时,此时会产生死锁。
以下代码必然会产生死锁,在该方法中让线程停顿几秒以产生死锁
模拟死锁的过程二:
public class T {
Object o1 = new Object();
Object o2 = new Object();
private void m1() {
synchronized (o1) {
try {
System.out.println("锁住o1");
Thread.sleep(1000);
synchronized (o2) {
System.out.println("获取o2");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("m1调用");
}
private void m2() {
synchronized (o2) {
try {
System.out.println("锁住o2");
Thread.sleep(2000);
synchronized (o1) {
System.out.println("获取o1");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("m2调用");
}
public static void main(String[] args) {
T t = new T();
new Thread(t::m1,"t1").start();
new Thread(t::m2,"t2").start();
}
}