无等待和无锁算法的示例/说明

时间:2010-11-18 02:39:10

标签: java multithreading algorithm nonblocking

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

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

3 个答案:

答案 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中ConcurrentLinkedQueuewait-free实现的一个例子。

为了进一步了解,我希望您阅读本文,Brian Goetz的 Going atomic - 撰写 Java Concurrency in Practice 的人。< / p>

答案 2 :(得分:1)

从弱势到强势状态:

一种方法无锁,如果它保证无限次某些方法调用在有限的步骤中完成。

方法无等待,如果它保证每次调用以有限的步骤完成执行。

显然,任何无等待方法实现也是无锁的,但反之亦然。无锁算法承认某些线程可能会饿死。

然而,从实践的角度来看,&#34;在很多情况下,尽管可能,饥饿是极不可能的,因此快速无锁算法可能比较慢的无等待算法更具吸引力。

注意:更强大的属性称为&#34; 有限等待&#34;这意味着:方法调用可以采用绑定步数