下面是一个死锁的例子:
当第一个线程类的参数为true时,走run方法,接着要2把锁才能走完,另外,另一个线程类也可以走完。但是,这只是个别情况,大多数情况下,程序都是未能走完的,因为当第一个线程类走到第一把锁(假如是objA)的时候,这时候可能第二个线程类抢到CPU执行权,接着走run方法,而这时候第一个线程类走完第一把锁的钥匙((objA),在等第二把锁的钥匙((objB),但是另外一个线程类也是走了第一把锁的钥匙(objB),在等第二把锁的钥匙(objA),这个时候出现了相互等待的现象,这就叫死锁。
下面是一个简单的死锁小例子:
public class DieLockDemo {
public static void main(String[] args) {
DieLock d1 = new DieLock(true);
DieLock d2 = new DieLock(false);
d1.start();
d2.start();
}
}
class DieLock extends Thread {
private boolean flag;
//注意,这里要注意,锁一旦确定就是不变的,所以要用static
private static Object objA = new Object();
private static Object objB = new Object();
public DieLock(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
if (flag) {
synchronized (objA) {
System.out.println("if objA");
synchronized (objB) {
System.out.println("if objB");
}
}
} else {
synchronized (objB) {
System.out.println("else objB");
synchronized (objA) {
System.out.println("else objA");
}
}
}
}
}
|
|