死锁的产生与避免
程序员文章站
2022-04-17 14:38:01
...
什么是死锁
死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的互相等待的现象,在无外力作用的情况下,这些线程会一直相互等待而无法继续运行下去。
死锁的产生必须具备以下四个条件:
- 互斥条件: 指线程对己经获取到的资源进行排它性使用 , 即该资源同时只由 一个线程占用。
- 请求并持有条件 : 指一个线程己经持有了至少一个 资源 , 但又提出了新的资源请求 ,而新资源己被其他线程占有,所 以当前线程会被阻塞 ,但阻塞的同时并不释放自己己经获取的资源。
- 不可剥夺条件 : 指线程获取到的资源在自己使用完之前不能被其他线程抢占 , 只有在自己使用完毕后才由自己释放该资源。
- 环路等待条件 : 指在发生死锁时 , 必然存在一个线程→资源的环形链 , 即线程集合{TO , TL T2 ,…, Tn }中的TO 正在等待一个 Tl 占用的资源 , Tl 正在等待 T2 占用的资源,……Tn 正在等待 己被 TO 占用 的资源。
示例:
public class Wait {
public static Object lockA = new Object();
public static Object lockB = new Object();
static class ThreadA extends Thread{
@Override
public void run() {
synchronized (lockA) {
System.out.println("Thread A get lock A");
try {
this.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(lockB) {
System.out.println("Thread B get lock B");
}
}
}
}
static class ThreadB extends Thread{
@Override
public void run() {
synchronized (lockB) {
System.out.println("Thread B get lock B");
try {
this.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(lockA) {
System.out.println("Thread A get lock A");
}
}
}
}
public static void main(String[] args) throws InterruptedException {
ThreadA a = new ThreadA();
ThreadB b = new ThreadB();
a.start();
b.start();
}
}
结果:
如何避免线程死锁
造成死锁的原因其实和申请资源的顺序有很大关系 , 使用资源申请的有序性原则就可以避免死锁。
上一篇: 大小写字母闲侃生存之道
下一篇: 朗朗上口!爱情诗经