Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无等待和无锁算法示例/说明_Java_Multithreading_Algorithm_Nonblocking - Fatal编程技术网

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

Java 无等待和无锁算法示例/说明,java,multithreading,algorithm,nonblocking,Java,Multithreading,Algorithm,Nonblocking,我已经读过,无等待导致所有线程独立完成,无锁确保程序作为一个整体完成。我不太明白。有人能举个例子(java)来说明这一点吗 编辑:无锁意味着程序没有死锁吗?如果程序是无锁的,它基本上意味着至少有一个线程保证在任意时间段内取得进展。如果一个程序死锁,那么它的所有线程(以及整个程序)都不能取得进展——我们可以说它不是无锁的。由于无锁程序保证取得进展,因此它们保证完成(假设无例外的有限执行) 无等待是一个更强的条件,这意味着无论线程执行的时间/顺序如何,每个线程都保证在任意时间段内取得进展;所以我们可

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


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

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

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


我不知道有哪一个Java示例可以说明这一点,但我可以告诉您,无锁/无等待程序通常是在没有锁的情况下实现的,使用诸如CAS指令之类的低级原语。

否,
无锁
表示没有锁的程序。尽管如此,
无等待
算法也是无锁的;然而,反之亦然。但是,尽管如此,两者都是

这是了解无锁和无等待机制的绝佳读物

这个包是单变量无锁编程的一个例子。在Java 7中,有一个
无等待
实现的示例


为了进一步了解,我希望您阅读这篇文章,作者Brian Goetz——他在实践中编写了Java并发

从弱到强的条件:

如果一个方法能保证无限多地某些方法调用在有限的步骤中完成,那么它就是无锁的

如果方法保证每个调用都在有限的步骤中完成,则该方法是无等待的

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

然而,从“实际角度”来看,在许多情况下,饥饿虽然可能,但极不可能发生,因此快速无锁算法可能比较慢的无等待算法更具吸引力。


注意:一个更强大的属性称为“有界无等待”,这意味着:方法调用可以采取的步骤数有一个界。

这是否意味着任何没有死锁的程序都是无锁的?如果其中一个线程完成了,我们怎么能说整个程序已经完成?@iJeeves:lock free意味着没有锁,所以死锁是不可能的。不,你不能。你想知道一个程序的无锁属性如何意味着它保证完成?如果有有限数量的线程具有有限的工作负载,并且至少有一个活动线程保证在一段时间内(无锁属性)在其工作负载上取得进展,那么我们知道所有线程(以及程序)最终都将完成;无锁并不意味着无死锁,它是使用无锁算法的副作用。。。我认为这个术语更多的是关于不使用互斥锁来实现共享资源之间的同步(这是Nathan在谈到CAS指令时提到的)。你混淆了“无锁”和“无死锁”。奇怪的是,
ConcurrentLinkedQueue
确实被描述为“无等待”在Java 7中的实现,在Java 8中,该描述更改为不太严格的“非阻塞”(描述持续到Java 13,截至本评论的当前版本):我想知道发生了什么变化?@Peter,我想,他们将单词更改为“非阻塞”,以匹配Maged M.Michael和Michael L.Scott的原始论文的标题,在Java 7/8文档中,该链接似乎已断开。@AdeelAnsari无锁并不意味着“无锁”。这通常被称为无锁。