活锁出现在两个线程互相改变对方的结束条件,最后谁也无法结束,例如
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();
}
}
2.饥饿
很多教程中把饥饿定义为,一个线程由于优先级太低,始终得不到 CPU 调度执行,也不能够结束,饥饿的情况不易演示,讲读写锁时会涉及饥饿问题
下面我讲一下我遇到的一个线程饥饿的例子,先来看看使用顺序加锁的方式解决之前的死锁问题
可以使用顺序加锁的方式解决上图所示的死锁现象。
上图所示,两个线程都通过相同的拿锁顺序解决死锁问题。
但是实际上有些线程使用了顺序加锁会出现饥饿现象,部分线程一直拿不到锁
决死锁问题。
但是实际上有些线程使用了顺序加锁会出现饥饿现象,部分线程一直拿不到锁
所以最好不要用顺序加锁。



