死锁:
指多个进程or 线程在运行过程中因争夺资源而造成的一种僵局,当线程 处于 这种僵态是,若无外力作用,他们将无法再向前推进。
最常见的死锁情况,同步的嵌套:
同步中还有同步,两个同步用的不是一个锁。
我们应当,尽量避免同步嵌套的情况。
如下所示:
public class Clock {
public static Clock locka = new Clock();
public static Clock lockb = new Clock();
}
public class DeadLock implements Runnable {
private boolean flag;
public DeadLock(boolean flag){
this.flag = flag;
}
@Override
public void run() {
if(flag){
while(true){
synchronized(Clock.locka){
System.out.println(".................if locka");
synchronized(Clock.lockb){
System.out.println(".................if lockb");
}
}
}
}
else{
while(true){
synchronized(Clock.lockb){
System.out.println("-------------------------else lockb");
synchronized(Clock.locka){
System.out.println("----------------------else locka");
}
}
}
}
}
}
public class DeadLockTest {
public static void main(String[] args) {
DeadLock d1 = new DeadLock(true);
DeadLock d2 = new DeadLock(false);
Thread t1 = new Thread(d1);
Thread t2 = new Thread(d2);
t1.start();
t2.start();
}
}
上例中,当先线程1 拿到 Clock.locka , 线程2 拿到 Clock.lockb, 但 此时,线程1 需要 Clock.lockb 来继续运行,线程2 需要 Clock.locka 来继续运行,他们互不想让,就造成了死锁的状况。