Ced*_*tin 10 concurrency locking clojure lock-free lockless
我正在进行我的Clojure任务(在4clojure.com上解决了大约80个问题)并继续阅读和编码并试图"得到它".
现在我对Clojure被设计为"无锁并发"感到困惑.我非常了解死锁(例如:"我编写了糟糕的Java代码,最终导致死锁",而不是"我是并发专家").我也读过这个:
我意识到Clojure程序不会陷入僵局.
但是我有点困惑:通过在引擎盖下无锁算法实现或使用可能的"死锁"算法实现了这样的壮举,但使用正确的实现保证永远不会死锁(这将以某种方式"隐藏"给Clojure程序员)?
最近讨论过关于无锁算法的黑客新闻:
http://news.ycombinator.com/item?id=4103921
在1024cores.net上引用以下"无锁算法"页面:
http://www.1024cores.net/home/lock-free-algorithms
我不明白这篇文章与Clojure下的并发工作方式之间的关系.
它让我完全糊涂了:当我在Clojure中开发并发程序时,它是否意味着"锁定和无锁算法"对我来说不是问题?
通常,Clojure通过正确处理时间来避免锁定问题在许多系统中,对象的时间是一个非常松散的概念,因为在时间1(在更新之前)的对象被编辑到位以在时间-2(更新之后)成为该对象),在这个过程中它是第一个或第二个,因此我们使用锁来确保它只在此转换之前或之后可见.协调锁是从这个和死锁...
它是算法,数据结构和时间的组合.
Clojure通过组合不可变数据结构,函数编程和协调时间模型(引用,原子,代理等)来实现这一点.在这个模型中,一个函数需要一些东西并生成它的下一个版本,同时保留过去,只要有人在看它(直到GC到达它)
不可变数据结构:Clojure的集合在FP的意义上是持久的.新版本制作完成后,旧副本将"保留".这样观察者就不需要锁定对象,因为它们永远不会从它们下面改变.可能存在基于他们正在查看的版本的较新版本,但没有任何内容会更改其副本.
功能编程:纯粹(或尽可能接近)功能在一个时间点采集集合并生成下一个版本而不共享其内部状态,因此不需要锁定.这也有许多其他好处.
协调时间:当需要协调多个对象时,就像任何有趣的系统一样,那么Clojure的时间模型就会发挥作用.存在用于不同目的的不同机制.这有一个内部用于计算时间增量的锁,因此恰好有一个零时间,一个时间和一个时间N.所以它不是严格锁定的.STM包含您永远不需要与之交互的锁