锁定和atom/reset之间有什么区别/交换在Clojure

锁定和atom/reset之间有什么区别/交换在Clojure,clojure,synchronization,locking,atomic,Clojure,Synchronization,Locking,Atomic,我正在阅读一些源代码,在Clojure中遇到了锁定用法。这让我想到了原子版本。那么,两个代码片段之间的区别是什么,我认为它们做的是相同的事情 (定义锁(对象)) (锁 …一些操作) (定义状态(atom true)) (当@state (重置!状态为假) …一些手术 (重置!状态为真) 只有当多个线程正在更改一段可变状态时才需要锁定(也称为同步) 锁定宏是Clojure中几乎不需要使用的低级功能。它在某些方面类似于Java中的同步块 在clojure中,通常只使用atom来实现此目的。在极少数

我正在阅读一些源代码,在Clojure中遇到了
锁定
用法。这让我想到了原子版本。那么,两个代码片段之间的区别是什么,我认为它们做的是相同的事情

(定义锁(对象))
(锁
…一些操作)
(定义状态(atom true))
(当@state
(重置!状态为假)
…一些手术
(重置!状态为真)
只有当多个线程正在更改一段可变状态时才需要锁定(也称为同步)

锁定
宏是Clojure中几乎不需要使用的低级功能。它在某些方面类似于Java中的同步块

在clojure中,通常只使用
atom
来实现此目的。在极少数情况下,会调用
代理
ref
。在更罕见的情况下,您可以使用动态变量来获取线程的局部可变状态

在内部,Clojure
atom
将所有货币操作委托给类
java.util.concurrent.atomic.AtomicReference


您的代码片段显示了对atom的用途和操作的误解。两个并发线程可能会同时处理被截断的atom代码,因此这种尝试不会提供线程安全性,并且会导致错误和数据损坏


如果您想了解真正的原语(即Java 1.2)同步原语,请参阅:

  • 这本书(第一版显示了大部分细节,第三版。根据更高级别的课程)
  • 这本书太吓人了,你会发白的。读了这篇文章之后,你会非常害怕自己的并发性,以至于你永远不会再想这样做了
  • :这是一个很好的例子,说明了正确锁定是多么困难

  • 是的。使用原子、参考和代理。这将涵盖大多数用例