gpt4 book ai didi

java - 竞争条件和 clojure 原子

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:12:22 27 4
gpt4 key购买 nike

clojure“atom”的文档指出 -

"Changes to atoms are always free of race conditions."

但是,竞争条件不仅根据更改定义,而且在不同线程中并行逻辑操作的上下文中定义。

我想知道 - 保证“对原子的更改始终不受竞争条件影响” 的意义何在?在 java 中,我们有原子原语,它支持某些特定的线程安全操作(例如,AtomicInteger 支持“getAndIncrement”操作)。但是 Clojure 原子是类型不可知的,例如,我们可以调用:

  (atom "Hi im a string")  Or
(atom (.getClass Object))

atom 方法的灵 active 意味着 Clojure 在幕后不会“巧妙地”为 atom 提供类型特定的原子/线程安全操作。

因此,我想问——atom 方法到底对我们的对象“做了什么”(即它只是同步了整个对象吗?)

最佳答案

atom实际上是保证线程安全的原子存储位置。

原子类似于 Java 的原子数据类型(如 AtomicReference ),但实际上更强大一些,因为原子允许您使用任意函数来更新原子。示例:

(def a (atom "foo"))

(defn appender [x]
"Higher order function that returns a function which appends a specific string"
(fn [s]
(str s x)))

(swap! a (appender "bar"))
=> "foobar"

在上面的例子中,swap! operation 以原子方式运行,即使我们传递给它的 appender 操作可能是一个非常复杂的函数。实际上,原子允许您以原子方式使用任意更新操作(您通常应该坚持使用纯函数,因为在发生争用时可能会多次调用该函数)。

Atoms 显然不能保证你放入其中的对象的线程安全(例如,如果你将一个非同步的 Java ArrayList 放入其中,那么并发使用它仍然是不安全的)。但是,如果您坚持使用完全线程安全的 Clojure 不可变数据类型,那么您会很好。

关于java - 竞争条件和 clojure 原子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9660647/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com