多线程教程(十七)活锁、饥饿
1. 活锁
活锁出现在两个线程互相改变对方的结束条件,最后谁也无法结束,例如
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 调度执行,也不能够结束,饥饿的情况不易演示,讲读写锁时会涉及饥饿问题
下面我讲一下我遇到的一个线程饥饿的例子,先来看看使用顺序加锁的方式解决之前的死锁问题

可以使用顺序加锁的方式解决上图所示的死锁现象。

上图所示,两个线程都通过相同的拿锁顺序解决死锁问题。
但是实际上有些线程使用了顺序加锁会出现饥饿现象,部分线程一直拿不到锁
决死锁问题。
但是实际上有些线程使用了顺序加锁会出现饥饿现象,部分线程一直拿不到锁
所以最好不要用顺序加锁。
本文介绍了多线程编程中的活锁与饥饿现象。通过示例代码解释了活锁是如何发生的,即两个线程互相改变对方的结束条件,导致无法结束的情况。同时,讨论了线程饥饿的问题,即某些线程因无法获取资源而无法执行。
265

被折叠的 条评论
为什么被折叠?



