当线程中的同步代码有多个嵌套同步锁时容易发生死锁,下面的例子中3个线程公用3把锁,每个线程必须拿到2把才能继续运行,运行结束才能释放锁,由于3个线程一启动便分别占用了3把锁,都不能拿到第2把锁,又释放不掉已经拿到的锁,因此发生死锁现象:
public class F {
public static void main(String[] args) {
Lock r1 = new Lock("-同步锁1-");
Lock r2 = new Lock("-同步锁2-");
Lock r3 = new Lock("-同步锁3-");
MyThread mt1 = new MyThread(r1, r2, "-线程1-");
MyThread mt2 = new MyThread(r2, r3, "-线程2-");
MyThread mt3 = new MyThread(r3, r1, "-线程3-");
mt1.start();
mt2.start();
mt3.start();
}
}
class Lock {
String name;
public Lock(String name) {
this.name = name;
}
}
class MyThread extends Thread{
String name;
Lock r1,r2;
public MyThread(Lock r1, Lock r2, String name) {
this.r1 = r1;
this.r2 = r2;
this.name = name;
}
public void run() {
synchronized (r1) {
System.out.println(name + "获得" + r1.name);
System.out.println(name + "等待" + r2.name + "...");
synchronized (r2) {
System.out.println(name + "获得" + r2.name);
}
}
}
}
运行结果:
-线程3-获得-同步锁3-
-线程2-获得-同步锁2-
-线程1-获得-同步锁1-
-线程1-等待-同步锁2-...
-线程2-等待-同步锁3-...
-线程3-等待-同步锁1-...