并发 – 使用无锁算法可以解决Clojure lockfree吗?

我正在进步我的Clojure任务(大约80个问题在4clojure.com上解决),我继续阅读和编码,并试图“得到它”.

现在我被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通过适当地处理时间来避免锁的问题在许多系统中,对于一个对象来说,时间是一个非常松散的概念,因为在时间-1(更新前)的对象被编辑到时间-2(更新后)成为该对象),在这个过程中,它是第一个也不是第二个,所以我们使用锁来确保它只有在这个转换之前或之后才可见.协调锁从这个和死锁从…

它是算法,数据结构和时间的组合.

Clojure通过组合不可变数据结构,功能编程和协调时间模型(参考,原子,代理等)来实现.在这个模型中,一个函数需要一些东西,并产生下一个版本,同时保留过去只要有人正在看它(直到GC得到它)

>不变的数据结构:Clojure的集合在FP的意义上是永恒的.新版本后,旧版本“持续”.这样,观察者不需要锁定对象,因为它们永远不会从它们之下改变.可能存在基于他们正在查看的版本的较新版本,尽管没有更改其副本.
>功能编程:纯(或尽可能接近不变)功能一个时间点收集一个集合,共享其内部状态,因此不需要锁定.这还有许多其他好处.
> Coordinated time:当需要协调多个对象时,如同有趣的系统一样,Clojure的时间模型就起作用了.有不同的机制用于不同的目的.这有一个内部使用的锁来计算时间增量,使得只有一次零,一次一次和一次N.所以它不是严格锁定的. STM包含您永远不需要与之进行交互的锁

*好…几乎从来没有;-)

相关文章

应用场景 C端用户提交工单、工单创建完成之后、会发布一条工...
线程类,设置有一个公共资源 package cn.org.chris.concurre...
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量