跳到主要内容

死锁

死锁的概念

死锁描述了一种情况,其中两个或多个线程永远被阻塞,互相等待

死锁发生条件

  • 互斥条件

    线程要求对所分配的资源进行排他性控制,即在一段时间内某资源仅为一个线程所占有。此时若有其他线程请求该资源,则请求线程只能等待。

  • 不可剥夺条件

    线程所获得的资源在未使用完毕之前,不能被其他线程强行夺走,即只能由获得该资源的线程自己来释放(只能是主动释放)。

  • 请求与保持条件

    线程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他线程占有,此时请求线程被阻塞,但对自己已获得的资源保持不放。

  • 循环等待

    存在一种线程资源的循环等待链,链中每一个线程已获得的资源同时被链中下一个线程所请求。

示例

public class DaiLock {
public static void main(String[] args) {
Object o1 = new Object();
Object o2 = new Object();
DaiLcokTask task1 = new DaiLcokTask(o1, o2, true);
DaiLcokTask task2 = new DaiLcokTask(o1, o2, false);
Thread t1 = new Thread(task1, "线程一");
Thread t2 = new Thread(task2, "线程二");
t1.start();
t2.start();
}
}

class DaiLcokTask implements Runnable {
private Object o1;
private Object o2;
private boolean tag; // 模式

DaiLcokTask(Object o1, Object o2, boolean tag) {
this.o1 = o1;
this.o2 = o2;
this.tag = tag;
}

@Override
public void run() {
while (true) {
String name = Thread.currentThread().getName();
if (tag) {
synchronized (this.o1) {
System.out.println(name + "锁上o1");

synchronized (this.o2) {
System.out.println(name + "锁上o2");
}
}
}
else {
synchronized (this.o2) {
System.out.println(name + "锁上o2");

synchronized (this.o1) {
System.out.println(name + "锁上o1");
}
}
}
}
}
}
java

更多: 为什么不问一下隔壁的C/C++? 死锁

请作者喝奶茶:
Alipay IconQR Code
Alipay IconQR Code
本文遵循 CC CC 4.0 BY-SA 版权协议, 转载请标明出处
Loading Comments...