Clojure 本地定义的atom对其他线程可见吗?

Clojure 本地定义的atom对其他线程可见吗?,clojure,Clojure,为了实现自动化,我必须遵循以下代码,该函数接受一个唯一的数字,并启动firefox。我可以启动多个线程,每个线程都有一个唯一的x传递给函数,因此函数将并发执行。那么本地atom当前页面是否对其他线程可见?如果可见,则重置!无法将atom设置为另一个线程的预期值 (defn consumer-scanning-pages [x] (while true (let [driver (get-firefox x) current-page (atom 0)]

为了实现自动化,我必须遵循以下代码,该函数接受一个唯一的数字,并启动firefox。我可以启动多个线程,每个线程都有一个唯一的x传递给函数,因此函数将并发执行。那么本地atom当前页面是否对其他线程可见?如果可见,则重置!无法将atom设置为另一个线程的预期值

(defn consumer-scanning-pages [x]
  (while true
    (let [driver (get-firefox x)
          current-page (atom 0)]
             ....
            (reset! current-page ..)
      )))

不会的。每次调用函数时,您都在创建一个新原子


如果您想要一个共享的atom,只需将atom作为参数传递给消费者扫描页面,它不会。每次调用函数时,您都在创建一个新原子


如果您想要共享atom,只需将atom作为参数传递给用户扫描页面

atom将对您显式传递给的线程可见,并传递给这些线程传递给的任何其他线程等。在这方面,它与您可能传递或不传递的任何其他值没有区别

“将atom传递给线程”可以非常简单,就像引用存储在Clojure线程启动表单主体中的本地作用域一样:

(let [a (atom :foo)]
  ;; dereferencing the future object representing an off-thread computation
  @(future
     ;; dereferencing the atom on another thread
     @a))
;;= :foo

仅仅创建一个atom并不能使它对那些没有显式提供给它的代码可用,对于在最初创建atom的线程上运行的代码也是如此。(考虑一个创建原子的函数,但决不将其存储在任何外部可见的数据结构中,并最终返回一个无关的值。当函数返回时,它创建的原子将成为GC的资格;它对任何其他代码、同一线程或任何其他线程都不可见。)再次,所有其他值也是如此。

原子对于那些显式传递给它的线程、那些线程传递给它的任何其他线程都是可见的。在这方面,原子与任何其他可以传递或不传递的值没有什么不同

“将atom传递给线程”可以非常简单,就像引用存储在Clojure线程启动表单主体中的本地作用域一样:

(let [a (atom :foo)]
  ;; dereferencing the future object representing an off-thread computation
  @(future
     ;; dereferencing the atom on another thread
     @a))
;;= :foo
仅仅创建一个atom并不能使它对那些没有显式提供给它的代码可用,对于在最初创建atom的线程上运行的代码也是如此。(考虑一个函数,该函数创建一个原子,但从不将其存储在任何外部可见的数据结构中,并最终返回一个不相关的值。当该函数最晚返回时,它创建的原子将符合GC的条件;它对同一线程或任何其他线程上的任何其他代码都不可见。)再次,所有其他值也是如此