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



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

(def lock (Object.))
(locking lock
...some operation)
(def state (atom true))
(when @state
(reset! state false)
...some operation
(reset! state true))

只有当多个线程正在更改一段可变状态时,才需要锁定(也称为同步(。

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

在clojure中,通常只使用atom来实现此目的。在极少数情况下,需要agentref。在更罕见的情况下,您可以使用动态Var来获取线程本地可变状态。

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


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


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

  • Oracle文档
  • 《高效Java》一书(第1版显示了大部分细节,第3版遵循更高级别的类(
  • 《实践中的Java并发》这本书太可怕了,会让你头发都白了。看完这篇文章后,你会非常害怕滚动自己的并发,以至于你再也不会考虑这样做了
  • 双重检查锁定被破坏:这是一个很好的例子,说明了正确锁定是多么困难(也在这里(

最新更新