- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
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/
假设我正在使用 APC,其中过程和调用代码都使用 SetLastError 和 GetLastError。这会导致 GetLastError 产生不可预测的值。有什么办法可以解决这个问题吗? VOID
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 7年前关闭。 Improve t
任何人都可以,请告诉我,如何在不进行JavaScript轮询/ setInterval的情况下,在完整日历上填充/显示在服务器端动态更新的数据。 grails中提供了Atmosphere插件,但是文档
我正在尝试调整我的代码,从仅在前台使用 WCSessionDelegate 回调到在后台通过 handleBackgroundTasks: 接受 WKWatchConnectivityRefreshB
我正在构建批处理系统。 单位 的批处理数量从 20 到 1000 不等。每个 Unit 本质上都是模型的层次结构(一个主模型和许多子模型)。我的任务涉及将每个模型层次结构作为单个事务保存到数据库中(每
我拍了一张图片并将其切成三 block ,然后将它们向右浮动,让文字围绕它们流动。 HTML 看起来像这样: 在我添加侧边栏并将其 float 到图像的右上方之前,它工作正常,就像这样... T
我正在考虑嵌入式 Linux 项目(还没有硬件)中即将出现的情况,其中两个外部芯片需要共享一条物理 IRQ 线。这条线在硬件中能够实现边沿触发,但不能实现电平触发中断。 查看 Linux 中的共享 i
我观察到,当 linux futexes 发生争用时,系统会在自旋锁上花费大量时间。我注意到即使不直接使用 futex 也是一个问题,但在调用 malloc/free、rand、glib 互斥调用和其
我终于能够获得一些工具提示,最终可以使用以下代码: Hover over me 然后 $('[rel=tooltip]').tooltip(); 我遇到的问题是它使用 jQueryUI 工
我是一名优秀的程序员,十分优秀!