【问题标题】:What is the difference between locking and atom/reset!/swap! in Clojure锁定和 atom/reset!/swap! 之间有什么区别!在 Clojure 中
【发布时间】:2023-03-10 20:25:01
【问题描述】:

我在阅读一些源代码时遇到了 Clojure 中的 locking 用法。这让我想到了原子版本。那么2个代码sn-ps有什么区别,我认为他们做的是一样的事情呢?

(def lock (Object.))

(locking lock
  ...some operation)
(def state (atom true))

(when @state
  (reset! state false)
  ...some operation
  (reset! state true))

【问题讨论】:

    标签: clojure synchronization locking atomic


    【解决方案1】:

    只有当多个线程正在改变一个可变状态时才需要锁定(又称同步)。

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

    在 clojure 中,通常只使用 atom 来达到此目的。在极少数情况下需要agent 或ref。在更罕见的情况下,您可以使用动态 Var 来获取线程局部可变状态。

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


    您的代码 sn-p 显示了对原子用途和操作的误解。两个并发线程可以同时处理您的原子代码,因此该尝试不提供线程安全性,并且会导致错误和损坏的数据。


    如果您想探索 really 原语(即 Java 1.2)同步原语,请参阅:

    【讨论】:

    • 是的。使用原子、参考和代理。这将涵盖大多数用例
    猜你喜欢
    • 2023-03-23
    • 2021-10-01
    • 2012-06-28
    • 2021-07-04
    • 2011-10-16
    • 2020-06-22
    • 2011-04-08
    • 2015-01-17
    • 2012-01-11
    相关资源
    最近更新 更多