6.3 使用Atoms进行非并发同步修改
原子(Atoms)是一种比引用轻量的同步机制。
创建原子语法:
(atom initial-state options?)
这里的选项options与引用refs的选项一样
示例:
使用atom存贮当前曲目代替引用ref
(def current-track (atom "Venus, the Bringer of Pease"))
同样的也可以通过deref和@读者宏查看atom的值:
user=> (deref current-track)
"Venus, the Bringer of Peace"
user=> @current-track
"Venus, the Bringer of Peace"
原子(atoms)不参与事务,因此修改atoms的值时,不需要dosync,直接调用reset!:
(reset! an-atom newval)
如修改current-track为“Credo”:
(reset! current-track "Credo")
使用reset!不能直接同时修改current-track和current-composer在一个原子中。但是可以通过将current-track和current-composer存贮到一个map中,然后通过atom来同时修改:
user=> (def current-track (atom {:title "Credo" :composer "Byrd"}))
#'user/current-track
user=> (reset! current-track {:title "Spem in Alium" :composer "Tallis"})
{:title "Spem in Alium", :composer "Tallis"}
如果要部分修改上述map,则可以使用swap!:
(swap! an-atom f & args)
swap更新atom的值通过函数f及其参数args,如只修改上述current-track的标题:
user=> (swap! current-track assoc :title "Sancte Deus")
{:title "Sancte Deus", :composer "Tallis"}
原子(Atoms)是一种比引用轻量的同步机制。
创建原子语法:
(atom initial-state options?)
这里的选项options与引用refs的选项一样
示例:
使用atom存贮当前曲目代替引用ref
(def current-track (atom "Venus, the Bringer of Pease"))
同样的也可以通过deref和@读者宏查看atom的值:
user=> (deref current-track)
"Venus, the Bringer of Peace"
user=> @current-track
"Venus, the Bringer of Peace"
原子(atoms)不参与事务,因此修改atoms的值时,不需要dosync,直接调用reset!:
(reset! an-atom newval)
如修改current-track为“Credo”:
(reset! current-track "Credo")
使用reset!不能直接同时修改current-track和current-composer在一个原子中。但是可以通过将current-track和current-composer存贮到一个map中,然后通过atom来同时修改:
user=> (def current-track (atom {:title "Credo" :composer "Byrd"}))
#'user/current-track
user=> (reset! current-track {:title "Spem in Alium" :composer "Tallis"})
{:title "Spem in Alium", :composer "Tallis"}
如果要部分修改上述map,则可以使用swap!:
(swap! an-atom f & args)
swap更新atom的值通过函数f及其参数args,如只修改上述current-track的标题:
user=> (swap! current-track assoc :title "Sancte Deus")
{:title "Sancte Deus", :composer "Tallis"}