📝个人主页:五敷有你
🔥系列专栏:并发编程
⛺️稳重求进,晒太阳
活锁
定义:活锁出现在两个线程互相改变对象的结束条件,最后谁也无法结束
代码示例
public class TestLiveLock {
static volatile int count = 10;
static final Object lock = new Object();
public static void main(String[] args) {
new Thread(() -> {
// 期望减到 0 退出循环
while (count > 0) {
sleep(0.2);
count--;
log.debug("count: {}", count);
}
}, "t1").start();
new Thread(() -> {
// 期望超过 20 退出循环
while (count < 20) {
sleep(0.2);
count++;
log.debug("count: {}", count);
}
}, "t2").start();
}
}
解锁方式:
- 错开执行,
- 睡眠时间随机等
饥饿
很多教程把饥饿定义为:一个线程由于优先级太低,始终得不到CPU调度执行,也不能够结束,饥饿的情况不易演示,讲读写锁时会设计饥饿问题。