什么情况下导致线程死锁:
所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
产生条件:
(1)互斥条件:
线程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个线程所占有。此时若有其他线程请求该资源,则请求线程只能等待。
(2)不剥夺条件:线程所获得的资源在未使用完毕之前,不能被其他线程强行夺走,即只能由获得该资源的线程自己来释放(只能是主动释放)。
(3)请求和保持条件:线程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他线程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
(4)循环等待条件:存在一种线程资源的循环等待链,链中每一个线程已获得的资源同时被链中下一个线程所请求。即存在一个处于等待状态的线程集合{Pl, P2, ..., pn},其中Pi等待的资源被P(i+1)占有(i=0, 1, ..., n-1),Pn等待的资源被P0占有
public class DeadLock implements Runnable{
public int ff=1;
//静态对象是类的所有对象共享的
//new两个object
private static Object o1 = new Object(),
o2 = new Object();
@Override
public void run() {
System.out.println("ff=" + ff);
//如果为1就o1对象先锁然后再锁o2
if (ff==1){
synchronized (o1){
try {
Thread.sleep(500);
System.out.println("锁o1");
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2){
System.out.println("o2");
}
}
}
//如果为0就o2对象先锁然后再锁o2
if (ff==0){
synchronized (o2){
try {
Thread.sleep(500);
System.out.println("锁o2");
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1){
System.out.println("o1");
}
}
}
}
}
//执行代码
DeadLock deadLock1 = new DeadLock();
DeadLock deadLock2 = new DeadLock();
deadLock1.ff=1;
deadLock2.ff=0;
//deadLock1,deadLock2 都处于可执行状态,但 JVM 线程调度先执行哪个线程是不确定的。
//deadLock2 的 run()可能在 deadLock1 的 run()之前运行
new Thread(deadLock1).start();
new Thread(deadLock2).start();