为什么无锁并发这么大(在Clojure中)?

i_l*_*eys 6 concurrency deadlock clojure lock-free

我被告知Clojure具有无锁并发性,这很重要.

我使用了许多语言,但没有意识到他们在幕后执行锁定.

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

Art*_*ldt 9

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

  • 在Clojure STM中,读者甚至不必等待其他编写者(除非他们想要进行事务读取以获得跨多个引用的一致快照) (2认同)

Noo*_*ilk 8

我不能特别谈论Clojure,但是......这意味着在你开始工作之前,你不需要等待别人做某事.哪个好.

通常,它是通过不可变类型实现的.如果没有任何东西可以修改,你真的不需要等到别人完成它才能访问它.

  • *someone*只是另一个代码,在另一个线程中,访问该对象. (4认同)
  • 谁是'某人'?你举个例子吗?我不认为有人会和我分享我的对象.也许我应该在床下检查. (2认同)

tom*_*jen 5

死锁.或者更正确的是缺乏它们.

大多数语言中最大的问题之一是你最终遇到的僵局是:

  1. 在地球上调试.
  2. 很难确定你已经摆脱了.

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


mik*_*era 5

最大的问题是锁不构成.

虽然使用简单的锁定策略编写代码(例如将其置于同步的Java类中)是微不足道的,但是当您开始锁定多个对象时,它会成倍地变得复杂,并开始创建组合不同锁定的复杂事务操作.死锁可能发生,性能受损,锁定逻辑开始使代码极其复杂,并且在某些时候代码开始变得不可维护.

对于那些必须构建大型复杂并发系统的人来说,这些问题将变得明显(解决这些问题是Rich Hickey创建Clojure的主要动机).

第二个问题是表现.

锁定和STM都明显地增加了开销.但在某些重要情况下,STM开销可能会低得多.

特别是,无锁并发(与Clojure STM一样)通常意味着如果读者访问事务外的数据,读者不会受到任何其他线程(包括编写器!)的影响.在相当常见的情况下,这可能是一个巨大的胜利,读取不需要是事务性的并且显着地超过写入数量(想想大多数Web应用程序.....).Clojure中STM引用的非事务性读取基本上是无开销的.