2015-08-20 23 views
1

假設foo和bar是原子。Clojure一次復位多個原子

; consistent. 
(reset! foo x) 
; inconsistent x and y combination. 
(reset! bar y) 
; consistent. 

是否可以立即重置它們,以便其他線程不會看到這種不一致?或者是否有必要將x和y捆綁到一個原子中,而不是讓x和y本身是原子?

回答

4

對於多個引用的協調更新,您希望使用refs,而不是原子。 Refs只能在一個事務中修改,並且Clojure的STM(軟件事務內存)確保在提交事務之前所有對refs的操作都成功,所以事務外的所有線程都可以看到一個一致的refs視圖。

(def foo (ref :x)) 
(def bar (ref :y)) 
(dosync 
    (ref-set foo :x1) 
    (ref-set bar :y1)) 

在這個例子中,如果任一參考文獻,通過在另一個線程一個事務修改的交易(由dosync劃定)將被重試,確保其他線程看到的foobar的一致視圖。

在使用STM時會有開銷,所以選擇使用協調參考還是封裝所有可變狀態的單個原子將取決於您的確切用法。

3

Clojure website's page on atoms(強調):

原子提供了一種方法來管理共享,同步,獨立狀態。

這意味着每個​​是相互獨立的,因此,一組的​​s不能用原子方式更新。

您可以將兩個項目合併爲一個​​。但你也可能要考慮refs,它提供了多個項目的事務更新:

事務引用(參考文獻)保證通過軟件事務內存的安全共享使用可變的存儲位置(STM)