i_l*_*eys 6 concurrency deadlock clojure lock-free
我被告知Clojure具有无锁并发性,这很重要.
我使用了许多语言,但没有意识到他们在幕后执行锁定.
为什么这是Clojure(或任何具有此功能的语言)的优势?
无锁并发还提供了读者永远不必等待其他读者的好处.当许多线程从单个源读取数据时,这尤其有用.您仍然需要在程序中定义数据依赖项,并明确定义可以安全转换的事务部分.
STM可以避免死锁和几乎所有的活锁,虽然它不会使您免于并发故障,但仍然可以创建事务失败的情况,因为它缺少维护其历史记录的资源,但重要的是并发失败将是显式的你可以从中恢复
我不能特别谈论Clojure,但是......这意味着在你开始工作之前,你不需要等待别人做某事.哪个好.
通常,它是通过不可变类型实现的.如果没有任何东西可以修改,你真的不需要等到别人完成它才能访问它.
最大的问题是锁不构成.
虽然使用简单的锁定策略编写代码(例如将其置于同步的Java类中)是微不足道的,但是当您开始锁定多个对象时,它会成倍地变得复杂,并开始创建组合不同锁定的复杂事务操作.死锁可能发生,性能受损,锁定逻辑开始使代码极其复杂,并且在某些时候代码开始变得不可维护.
对于那些必须构建大型复杂并发系统的人来说,这些问题将变得明显(解决这些问题是Rich Hickey创建Clojure的主要动机).
第二个问题是表现.
锁定和STM都明显地增加了开销.但在某些重要情况下,STM开销可能会低得多.
特别是,无锁并发(与Clojure STM一样)通常意味着如果读者访问事务外的数据,读者不会受到任何其他线程(包括编写器!)的影响.在相当常见的情况下,这可能是一个巨大的胜利,读取不需要是事务性的并且显着地超过写入数量(想想大多数Web应用程序.....).Clojure中STM引用的非事务性读取基本上是无开销的.
| 归档时间: |
|
| 查看次数: |
2591 次 |
| 最近记录: |