Ert*_*tin 0 synchronization locking atomic clojure
我正在阅读一些源代码并locking
在 Clojure 中遇到了用法。这让我想到了 atom 版本。那么2个代码片段之间有什么区别,我认为它们做同样的事情?
(def lock (Object.))
(locking lock
...some operation)
Run Code Online (Sandbox Code Playgroud)
(def state (atom true))
(when @state
(reset! state false)
...some operation
(reset! state true))
Run Code Online (Sandbox Code Playgroud)
仅当多个线程更改一个可变状态时才需要锁定(又名同步)。
该locking
宏是一个低级别的功能,一个几乎从来没有需要Clojure中使用。它在某些方面类似于 Java 中的同步块。
在 clojure 中,通常只是atom
为此目的使用 an 。在极少数情况下需要使用agent
或ref
。在更罕见的情况下,您可以使用动态 Var 来获取线程本地可变状态。
在内部,Clojureatom
将所有货币操作委托给类java.util.concurrent.atomic.AtomicReference
。
您的代码片段显示了对原子目的和操作的误解。两个并发线程可以同时处理您截断的原子代码,因此该尝试不提供线程安全性,并且会导致错误和数据损坏。
如果您想探索真正原始的(即 Java 1.2)同步原语,请参阅: