我已经读过等待使得所有线程独立完成并且无锁可确保程序整体完成。我不太明白。任何人都可以举一个例子(java)来说明这一点。
编辑:无锁意味着没有死锁的程序吗?
答案 0 :(得分:16)
如果一个程序是无锁的,它基本上意味着至少有一个的线程可以保证在任意时间段内取得进展。如果一个程序死锁,它的所有线程(以及整个程序)都无法取得进展 - 我们可以说它不是无锁的。由于无锁程序可以保证取得进展,因此可以保证它们完成(假设有限执行没有例外)。
无等待是一个更强的条件,这意味着无论线程执行的时间/顺序如何,每个线程都可以保证在任意时间段内取得进展;所以我们可以说线程是独立完成的。所有等待免费程序都是无锁的。
我不知道任何说明这种情况的Java示例,但我可以告诉你,无锁/无等待程序通常在没有锁的情况下使用CAS指令等低级原语实现。
答案 1 :(得分:16)
没有。 Lock-free
表示没有锁的程序;顺便说一下,wait-free
算法也是lock-free
,但反之亦然。因此,两者都是non-blocking algorithms。
这个wiki entry非常适合理解无锁和无等待机制。
好吧,java.util.concurrent.atomic
包是对单个变量进行lock-free
编程的一个例子。在Java 7中ConcurrentLinkedQueue
是wait-free
实现的一个例子。
为了进一步了解,我希望您阅读本文,Brian Goetz的 Going atomic - 撰写 Java Concurrency in Practice 的人。< / p>
答案 2 :(得分:1)
从弱势到强势状态:
一种方法无锁,如果它保证无限次某些方法调用在有限的步骤中完成。
方法无等待,如果它保证每次调用以有限的步骤完成执行。
显然,任何无等待方法实现也是无锁的,但反之亦然。无锁算法承认某些线程可能会饿死。
然而,从实践的角度来看,&#34;在很多情况下,尽管可能,饥饿是极不可能的,因此快速无锁算法可能比较慢的无等待算法更具吸引力。
注意:更强大的属性称为&#34; 有限等待&#34;这意味着:方法调用可以采用绑定步数。