Deadlock and livelock
wikipedia Deadlock
Livelock
baike 活锁
Example
单一实体的活锁
例如线程从队列中拿出一个任务来执行,如果任务执行失败,那么将任务重新加入队列,继续执行。假设任务总是执行失败,或者某种依赖的条件总是不满足,那么线程一直在繁忙却没有任何结果。
协同导致的活锁
NOTE:
1、"协同"是指有多人同时参与
生活中的典型例子: 两个人在窄路相遇,同时向一个方向避让,然后又向另一个方向避让,如此反复。
通信中也有类似的例子,多个用户共享信道(最简单的例子是大家都用对讲机),同一时刻只能有一方发送信息。发送信号的用户会进行冲突检测, 如果发生冲突,就选择避让,然后再发送。 假设避让算法不合理,就导致每次发送,都冲突,避让后再发送,还是冲突。
计算机中的例子:两个线程发生了某些条件的碰撞后重新执行,那么如果再次尝试后依然发生了碰撞,长此下去就有可能发生活锁。
NOTE:
1、从上面的描述可以看出,livelock本质上就是不断地碰撞
解决方法
解决协同活锁的一种方案是调整重试机制。
**比如引入一些随机性。**例如如果检测到冲突,那么就暂停随机的一定时间进行重试。这回大大减少碰撞的可能性。 典型的例子是以太网的CSMA/CD检测机制。
另外为了避免可能的死锁,适当加入一定的重试次数也是有效的解决办法。尽管这在业务上会引起一些复杂的逻辑处理。
比如约定重试机制避免再次冲突。 例如自动驾驶的防碰撞系统(假想的例子),可以根据序列号约定检测到相撞风险时,序列号小的飞机朝上飞, 序列号大的飞机朝下飞。 [2]
补充案例
dining philosopher
所有的哲学家,同时拿起左边的叉子,又同时方向,这是非常经典的案例。
TODO
https://www.guru99.com/what-is-livelock-example.html
https://www.geeksforgeeks.org/deadlock-starvation-and-livelock/
https://stackoverflow.com/questions/6155951/whats-the-difference-between-deadlock-and-livelock
https://stackoverflow.com/questions/1036364/good-example-of-livelock