现在我被Clojure设计为“无锁并发”有点困惑.我对死锁知之甚少(如:“我写的糟糕的Java代码,最终陷入死锁”,而不是“我在并发专家”).我也读过这个:
Why is lockless concurrency such a big deal (in Clojure)?
我意识到Clojure程序不会死机,
但我有点困惑:这是通过实现无障碍锁定算法实现的一个壮举,或者使用了潜在的“可锁定”算法,但使用正确的实现保证永远不会死锁(这将以某种方式“隐藏”到Clojure程序员)?
最近有关于无锁算法的黑客新闻的讨论:
http://news.ycombinator.com/item?id=4103921
引用1024cores.net上的以下“无锁算法”页面:
http://www.1024cores.net/home/lock-free-algorithms
我不明白这篇文章与Clojure之间如何并发工作的关系.
这让我很困惑:当我在Clojure中开发并发程序时,是否意味着“锁和无锁算法”对我来说是一个非问题?
解决方法
它是算法,数据结构和时间的组合.
Clojure通过组合不可变数据结构,功能编程和协调时间模型(参考,原子,代理等)来实现.在这个模型中,一个函数需要一些东西,并产生下一个版本,同时保留过去只要有人正在看它(直到GC得到它)
>不变的数据结构:Clojure的集合在FP的意义上是永恒的.新版本后,旧版本“持续”.这样,观察者不需要锁定对象,因为它们永远不会从它们之下改变.可能存在基于他们正在查看的版本的较新版本,尽管没有更改其副本.
>功能编程:纯(或尽可能接近不变)功能在一个时间点收集一个集合,共享其内部状态,因此不需要锁定.这还有许多其他好处.
> Coordinated time:当需要协调多个对象时,如同有趣的系统一样,Clojure的时间模型就起作用了.有不同的机制用于不同的目的.这有一个内部使用的锁来计算时间增量,使得只有一次零,一次一次和一次N.所以它不是严格锁定的. STM包含您永远不需要与之进行交互的锁
*好…几乎从来没有;-)