我听说 Clojure 具有无锁并发性,这很重要。

我使用过多种语言,但没有意识到它们在幕后执行锁定。

为什么这在 Clojure(或任何具有此功能的语言)中是一个优势?

有帮助吗?

解决方案

我无法左右的Clojure说话特别,但......这意味着你不必等待有人来的东西做之前,你可以开始工作。这是巨大的。

通常它与不可变的类型来实现的。如果没有可以修改,你真的不需要等到别人在用它做,然后才能访问它。

其他提示

无锁并发还提供了一个很好的优势: 读者永远不必等待其他读者。 当许多线程从单个源读取数据时,这尤其有用。您仍然需要在程序中定义数据依赖性,并显式定义可以安全交换的事务部分。
STM 可以让您避免死锁和几乎所有活锁的发生,尽管它不能让您避免并发故障,但您仍然可以创建事务失败的情况,因为它缺乏维护其历史记录的资源,但重要的是 并发失败将是明确的,您可以从中恢复

僵局。或者更正确地说,缺乏它们。

大多数语言中最大的问题之一是最终会出现以下死锁:

  1. 调试人间地狱。
  2. 很难确定你已经摆脱了。

现在没有锁了,显然你不会遇到死锁。

在最大的交易是的锁不构成

虽然是微不足道的写代码用一个简单的锁定策略(例如,把它放在一个同步的Java类......),它就会成倍更加复杂当你开始锁定多个目标,并开始创建复杂的交易是结合不同的锁定操作。会发生死锁,性能会受到影响,锁定逻辑开始使代码极其旋绕并在某一时刻的代码开始变得难以维护。

这些问题将变得明显的人谁建立一个大型的,复杂的并发系统(和解决这些问题是为丰富希基创造一个Clojure的主要动机)。

第二个问题是的性能

两个锁定和STM清楚地强加开销。但在某些情况下,重要的STM开销可以低得多。

在特别地,无锁并发(如使用Clojure STM)通常意味着读者不被任何其他线程受损(包括作家!),如果他们访问事务外的数据。这可能是在读不需要是事务性的,并大大多于写(想大多数Web应用程序.....)的相当普遍的情况下,一个巨大的胜利。 Clojure中的STM参考的非事务性读基本上开销自由。

只要你写的严格顺序程序(做A,然后是B,然后是C;!完)。你没有并发问题和语言的并发机制仍无关

当您从“编程练习”计划,以现实世界的东西毕业了,很快你会遇到的问题,其解决方法是多线程(或任何味道并发您有可用)。

案例:与GUI程序。你正在写与拼写检查的编辑器。你想拼写检查被悄悄做了的事情的背景,但你想要的GUI顺利接受用户输入。所以,你运行这两个活动,作为独立的线程。

案例:我最近写了一个程序(工作),从两个日志文件中收集统计数据,并将其写入到数据库。每个文件大约需要3分钟处理。余移动这些进程进入运行并排两个线程,切割总的处理时间为6分钟,以稍微超过3。

案例:科学/工程仿真软件。有问题很多很多是通过计算在每一个点在代表你的受试者(星核,核爆,昆虫人口的地理分布...)一个3维网格有一定的影响(热流,说的)解决。基本上是相同的计算是在每一点上完成的,并在很多点,因此是有意义的已他们并行完成。

在所有这些情况下,还有更多,每当两个计算过程在大致相同的时间访问相同的存储器(=变量,如果你喜欢)存在用于将它们彼此干扰和搞乱彼此的工作电势。计算机科学的巨大分支,就如何解决这类问题的想法“并发编程”交易的交易。

本主题的一个合理的有用的起始讨论可参见 Wikipedia中

无锁并发的好处是在程序中缺乏的复杂性。在命令式语言,并发编程依赖于锁,一旦该程序会变得比较复杂的,难以修复的bug僵局在蠕动。

这样的“无锁定并发”是不是一个真正的语言的特征;相反,它是一个平台或运行时环境的一个特征,荣辱与共是不会得到出的方式,让您使用这些设施的语言。

思考之间锁型和无锁并发是类似于自循环直译器问题的交易的数量:一个可在原子操作方面实现锁(例如比较并交换,或CAS),以及一个可以实现原子在锁方面的操作。这应该是在底部?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top