多线程 – 如何在Clojurescript中实现Atoms?

前端之家收集整理的这篇文章主要介绍了多线程 – 如何在Clojurescript中实现Atoms?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Clojure to address concurrency问题 we can use an atom写:
  1. user=> (def my-atom (atom 0))
  2. #'user/my-atom
  3.  
  4. user=> @my-atom
  5. 0
  6.  
  7. user=> (swap! my-atom inc)
  8. 1
  9.  
  10. user=> @my-atom
  11. 1
  12.  
  13. user=> (swap! my-atom (fn [n] (* (+ n n) 2)))
  14. 4

我们知道这(在Clojure实现中)是a wrapper around the Java Atomic object.

有趣的是,Atoms are replicated in ClojureScript处于句法级别 – 即使JavaScript运行时没有原子参考.

我的问题是,如何在Clojurescript中实现Atoms?它们只是一个对象包装器吗?

解决方法

它只返回并分配值.

在源头
https://github.com/clojure/clojurescript/blob/master/src/main/cljs/cljs/core.cljs#L4081

  1. (deftype Atom [state Meta validator watches]
  2. ...
  3. IDeref
  4. (-deref [_] state)
  5. ...)


https://github.com/clojure/clojurescript/blob/master/src/main/cljs/cljs/core.cljs#L4110

  1. (defn atom
  2. "Creates and returns an Atom ..."
  3. ([x] (Atom. x nil nil nil))
  4. ([x & {:keys [Meta validator]}] (Atom. x Meta validator nil)))

检查swap的执行情况!并重置!你会发现:

(设置!(.-状态a)新值)

然后,转到https://github.com/clojure/clojurescript/blob/3bb97961cbc958aeaeac506222dc7b9dcb0e9fc1/src/clj/cljs/compiler.clj#L771集!你会发现编译器只发出一个’赋值语句’:

  1. (defmethod emit* :set!
  2. [{:keys [target val env]}]
  3. (emit-wrap env (emits target " = " val)))

猜你在找的Java相关文章