【面试:并发篇21:多线程:活跃性】死锁、活锁、饥饿
00.前言
如果有任何问题请指出,感谢。
01.介绍
死锁:两个线程 t1 t2,两把锁 A B,t1持有A锁 t2持有B锁,此时t1想要再获得B锁 t2想要再获得A锁,但是它们都不释放自己所持有的锁,最终导致死锁。
活锁:两个线程互相改变对方的结束条件,导致最后谁也没办法结束
饥饿:多个线程中 有一个线程t,由于线程之间的冲突 导致t线程分的时间片低,导致t线程基本不运行,这种情况下t线程就处于饥饿
02.死锁
案例
两个线程 t1 t2,两把锁 A B,t1持有A锁 t2持有B锁,此时t1想要再获得B锁 t2想要再获得A锁
package cn.itcast.n4.deadlock;
import lombok.extern.slf4j.Slf4j;
import static cn.itcast.n2.util.Sleeper.sleep;
@Slf4j(topic = "c.TestDeadLock")
public class TestDeadLock {
public static void main(String[] args) {
test1();
}
private static void test1() {
Object A = new Object();
Object B = new Object();
Thread t1 = new Thread(() -> {
synchronized (A) {
log.debug("lock A");
sleep(1);
synchronized (B) {
log.debug("lock B");
log.debug("操作...");
}
}
}, "t1");
Thread t2 = new Thread(() -> {
synchronized (B) {
log.debug("lock B");
sleep(0.5);
synchronized (A) {
log.debug("lock A");
log.debug("操作...");
}
}
}, "t2");
t1.start