6.8. 死锁
1)死锁定义:
多个线程在运行过程中因争夺资源而造成的一种僵局,当线程处于这种僵持状态时,如果没有外力作用,这些线程将无法继续进行。
2) 死锁产生原因:
a.系统资源的竞争:系统资源竞争会导致系统资源不足以及资源分配不当,导致死锁。
b.线程的运行顺序不合适:线程在运行过程中请求和释放资源的顺序不当会导致死锁
3) 产生死锁的必要条件
a.互斥条件:线程对分配的资源有排他性控制,即在一段时间内某个资源仅为一个线程所占用。
b.请求和操持条件:当线程因请求资源而阻塞时,对已经获得的资源保持不放。
c.不剥夺条件:线程已经获得的资源在未使用之前,不能剥夺,只能在使用完时由自己释放。
d.环路等待:在发生死锁时,必然存在一个线程等待另一个线程的环形链。
4)样例程序
public class DeadLock {
public static void main(String[] args) throws InterruptedException {
DeadLockThread thread = new DeadLockThread();
thread.setDeadLockFlag("A");
Thread threadA = new Thread(thread);
threadA.setName("A");
threadA.start();
Thread.sleep(1000);
thread.setDeadLockFlag("B");
Thread threadB = new Thread(thread);
threadB.setName("B");
threadB.start();
}
}
class DeadLockThread extends Thread{
private String deadLockFlag;
private Object lockObject1 = new Object();
private Object lockObject2 = new Object();
public void setDeadLockFlag(String deadLockFlag){
this.deadLockFlag = deadLockFlag;
}
@Override
public void run(){
if("A".equals(deadLockFlag)){
synchronized (lockObject1) {
try {
System.out.println("线程" + Thread.currentThread().getName() + "开始");
Thread.sleep(2000);
synchronized (lockObject2){
System.out.println("线程" + Thread.currentThread().getName() + "进入锁");
}
System.out.println("线程" + Thread.currentThread().getName() + "结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}else {
synchronized (lockObject2) {
try {
System.out.println("线程" + Thread.currentThread().getName() + "开始");
Thread.sleep(2000);
synchronized (lockObject1){
System.out.println("线程" + Thread.currentThread().getName() + "进入锁");
}
System.out.println("线程" + Thread.currentThread().getName() + "结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}