能点击题目看的一定知道什么是死锁以及其形成原因,所以就不介绍,直接上代码。
static class A implements Runnable {
B b;
@Override
public void run() {
synchronized (b) {
try {
TimeUnit.MILLISECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
synchronized (this) {
System.out.println("A");
}
}
}
}
static class B implements Runnable {
A a;
public B(A a) {
this.a = a;
}
@Override
public void run() {
synchronized (a) {
try {
TimeUnit.MILLISECONDS.sleep(2);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
synchronized (this) {
System.out.println("B");
}
}
}
}
public static void main(String[] args) {
A a = new A();
B b = new B(a);
a.b = b;
new Thread(b).start();
new Thread(a).start();
}
代码中要注意的是sleep的时间,如果没有sleep或两个时间相等,那么运行10次也不一定能形成一次死锁,所以要错开两个线程的时间,这样一个死锁就轻松形成了,去把它写进你的系统吧。