免等待和免锁算法的示例/插图

我已经读到过,无等待会导致所有线程独立完成,无锁可确保程序作为一个整体完成。我不太明白。任何人都可以举个例子(java)来说明这一点。

编辑:无锁是否意味着没有死锁的程序?


答案 1

如果一个程序是无锁的,它基本上意味着它至少有一个线程保证在任意时间段内取得进展。如果一个程序死锁,它的线程(以及整个程序)都不能取得进展 - 我们可以说它不是无锁的。由于无锁程序可以保证取得进展,因此可以保证它们完成(假设有限执行无异常)。

无等待是一个更强的条件,这意味着无论线程执行的时间/顺序如何,都可以保证每个线程在任意时间段内取得进展;因此,我们可以说线程独立完成。所有免等待程序都是无锁的。

我不知道有任何Java示例可以说明这一点,但我可以告诉你,无锁/无等待程序通常在没有锁的情况下实现,使用低级基元,如CAS指令。


答案 2

非阻塞算法是指是否有保证的系统范围的进度,以及是否还有保证的每线程进度。因此,算法也是 ;但是,反之亦然。但是,两者都是非阻塞算法lock-freewait-freewait-freelock-free

这个wiki条目是一个很好的阅读和机制。lock-freewait-free

好吧,java.util.concurrent.atomic package就是在单个变量上编程的一个例子。在Java 7中,ConcurrentLinkedQueue就是一个实现的例子。lock-freewait-free

为了进一步了解,我希望您阅读本文,Brian Goetz的Going atomic - 他编写了Java Concurrency in Practice