进度保证

最终更新: 2025/02/06

很多并发算法会提供非阻塞的进度保证, 例如无锁(lock-freedom)和无等待(wait-freedom). 由于算法通常比较复杂, 因此很容易加入 bug, 导致算法阻塞. 使用模型检查策略, Lincheck 可以帮助你找到这种存活 bug.

要检查算法的进度保证性, 请在 ModelCheckingOptions() 中启用 checkObstructionFreedom 选项:

创建一个 ConcurrentMapTest.kt 文件. 然后添加下面的测试代码, 它能够检测出 Java 标准库中的 ConcurrentHashMap::put(key: K, value: V) 是一个阻塞操作:

运行 modelCheckingTest(). 你会得到以下结果:

下面我们来为非阻塞的 ConcurrentSkipListMap<K, V> 添加一个测试, 这个测试应该成功通过:

目前, Lincheck 只支持无阻塞(obstruction-freedom)的进度保证. 但是, 大多数现实生活中的存活 bug 都是由于添加了不正确的阻塞代码, 因此无阻塞(obstruction-freedom)检查 也有助于测试无锁(lock-freedom)和无等待(wait-freedom)算法.