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