1. Wait-Free 与 Lock-Free 的区别中为什么真正的 Wait-Free 实现极其困难?实际工程中的取舍?
Wait-Free 与 Lock-Free 有什么区别?为什么真正的 Wait-Free 实现极其困难?实际工程中应如何取舍?
- Lock-Free:系统级前进保证,但单个线程可能饥饿
- Wait-Free:每个线程都有界步数内完成
- 实现难度与工程取舍
两者都是无锁并发(无阻塞互斥锁)的实现。Lock-Free:保证整个系统在任意时刻必然有某个线程在有限步数内取得进展(系统级前进保证),但某个特定线程可能被无限推迟(饥饿),典型如 CAS 自旋循环。Wait-Free:更强的保证——每个线程在有限步数内必然完成自己的操作,不依赖其他线程的进度,即任何线程都不会被饿死。真正的 Wait-Free 实现极其困难,因为它要求每个操作在"其他线程可能无限干扰"的前提下仍保证有界推进,通常需要复杂的辅助机制(如帮助其他线程完成操作、读取时快照、用有限步完成发布),设计复杂度高、常量开销大、内存/同步开销昂贵。工程取舍:绝大多数生产系统用 Lock-Free(如 ConcurrentHashMap、无锁队列)即可,因为其保证已足够且实现简单、性能好;Wait-Free 仅在"最坏情况延迟必须严格有界"的实时系统、硬实时金融/网络场景中才值得,如抽取 RMW 的 wait-free 快照。
二者的本质区别是"前进保证的粒度":Lock-Free 保证系统前进,Wait-Free 保证每个线程前进。Wait-Free 因要为每个线程提供有界推进,必须处理"并发冲突导致的重试"与"帮助他人"的复杂交互,所以极难实现且常数大。实际工程中 Lock-Free 的 OS 级调度已能避免极端饥饿,故成本收益比更优。