首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >争用条件和conditions

争用条件和conditions
EN

Stack Overflow用户
提问于 2012-03-12 01:20:01
回答 1查看 1.7K关注 0票数 11

clojure "atom“的文档规定-

代码语言:javascript
复制
"Changes to atoms are always free of race conditions."

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

我想知道,保证“原子的变化永远不受种族条件的影响”有什么意义?在java中,我们有原子原语,它支持特定的某些线程安全操作(例如,AtomicInteger支持"getAndIncrement“操作)。但是Clojure原子与类型无关,例如,我们可以调用:

代码语言:javascript
复制
  (atom "Hi im a string")  Or
  (atom (.getClass Object))

atom方法的灵活性意味着Clojure在幕后并不“聪明”地为原子提供特定类型的原子/线程安全操作。

因此,我会问--原子方法到底在对我们的对象“做什么”(也就是说,它仅仅是同步整个对象?)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-12 01:53:06

原子实际上是一个原子存储位置,保证线程安全。

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

代码语言:javascript
复制
(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"

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

原子显然不能保证放置在其中的对象的线程安全性(例如,如果将不同步的ArrayList放入其中,那么并发使用仍然不安全)。但是,如果您坚持Clojure的不可变数据类型(这些数据类型都是完全线程安全的),那么您就很好了。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9660647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档