目录
构造几个死锁的例子(Java )
1
public class Deadlock {
public static void main(String[] args) {
final A a1 = new A("a1");
final A a2 = new A("a2");
a1.setA(a2);
a2.setA(a1);
Thread t1 = new Thread(()->{
a1.method1();
});
Thread t2 = new Thread(()->{
a2.method1();
});
t1.start();
t2.start();
}
}
class A {
String name;
A a;
public A(String name) {
this.name = name;
}
public void setA(A a) {
this.a = a;
}
synchronized void method1() {
System.out.println(Thread.currentThread().getName() + ": 锁住了" + name);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": 我在等待" + a.name);
a.method2();
}
synchronized void method2() {
System.out.println(Thread.currentThread().getName() + ": 我得到了" + name);
System.out.println(Thread.currentThread().getName() + ": " + name + "." + a.name + ".method2()");
}
}
运行结果:
2
public class Deadlock {
public static void main(String[] args) {
Thread t1 = new Thread(()->{
A.method1();
});
Thread t2 = new Thread(()->{
B.method1();
});
t1.start();
t2.start();
}
}
class A {
synchronized static void method1() {
System.out.println(Thread.currentThread().getName() + ": 锁住了" + A.class);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": 我在等待" + B.class);
B.method2();
}
synchronized static void method2() {
System.out.println(Thread.currentThread().getName() + ": 获得了" + A.class);
System.out.println(Thread.currentThread().getName() + ": " + A.class + ".method2");
}
}
class B {
synchronized static void method1() {
System.out.println(Thread.currentThread().getName() + ": 锁住了" + B.class);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": 我在等待" + A.class);
A.method2();
}
synchronized static void method2() {
System.out.println(Thread.currentThread().getName() + ": 获得了" + B.class);
System.out.println(Thread.currentThread().getName() + ": " + B.class + ".method2");
}
}
运行结果:
3
public class Deadlock {
public static void main(String[] args) {
final String lock1 = "lock1";
final String lock2 = "lock2";
Thread t1 = new Thread(()->{
synchronized (lock1) {
System.out.println(Thread.currentThread().getName() + ": 锁住了" + lock1);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": 在等待" + lock2);
synchronized (lock2) {
System.out.println(Thread.currentThread().getName() + ": 获得了" + lock2);
}
}
});
Thread t2 = new Thread(()->{
synchronized (lock2) {
System.out.println(Thread.currentThread().getName() + ": 锁住了" + lock2);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": 在等待" + lock1);
synchronized (lock1) {
System.out.println(Thread.currentThread().getName() + ": 获得了" + lock1);
}
}
});
t1.start();
t2.start();
}
}
运行结果: