有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java竞赛条件与clojure原子

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方法的灵活性意味着Clojure在幕后不会“聪明地”为atom提供特定类型的原子/线程安全操作

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


共 (1) 个答案

  1. # 1 楼答案

    {a1}实际上是保证线程安全的原子存储位置

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

    (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!操作的行为是原子性的,即使我们传递给它的appender操作可能是一个相当复杂的函数。实际上,atoms允许您以原子方式使用任意更新操作(您通常应坚持使用纯函数,因为在争用事件中函数可能被多次调用)

    Atoms显然不能保证放在它们里面的对象的线程安全(例如,如果你放了一个不同步的Java ArrayList在里面,那么并发使用仍然是不安全的)。然而,如果您坚持使用Clojure的不可变数据类型,这些数据类型都是完全线程安全的,那么您就很好了