2014-02-20 112 views
1

在閱讀clojure programming後,我有幾個關於參考和原子以及clojure參考類型的問題,而且大多數問題與本書有關。Clojure,原子和參考文獻

第一:

的書說,大約協調,和它說:「協同動作是其中多個參與者必須以獲得正確的結果進行合作。」這是否意味着如果我有3 fn fn1,fn2fn3,並且它們中的每一個都會執行一些可能會改變參考狀態的操作(假設它發生在每個自己的Thread中),它在鏈接操作中以同步方式發生?例如,fn1的輸出是fn2等的輸入。

二:

我無法理解refsatoms之間的差異。該書說refs用於協調同步,atoms用於不協調的同步。它們中的每一個(refsatoms)都有自己的示例,其中atoms以多功能(1個原子2功能)操作的方式使用,而多個refs具有1個功能。這本書並沒有舉例說明爲什麼我們不應該或不能以相反的方式去做。

回答

3
  • 原子允許多個線程將轉換應用於單個值並保證轉換是原子的。 swap!取原子和期望當前原子值的函數。用當前值調用該函數的結果存儲在原子中。多個對swap!的調用可能會交錯,但每個調用都將獨立運行。
  • 參考號允許多個線程以協調方式更新多個值。對sync內的所有裁判的所有更新都將完成或不會完成。您必須編寫代碼,以便滿足事務重試的要求。如果您可以放鬆操作的順序,可能會降低重新嘗試交易的機會(但不保證它),但有一些潛在的性能調整。
2

區別真的很容易。

refs在一個事務下運行(類似於數據庫事務)。想象一下銀行系統。你可以代表一個賬戶作爲參考。
要轉移資金,您需要啓動一個Clojure STM交易 - 通過(dosync) - 。從ref-1減去X的金額,並將該金額加到帳戶ref-2
如果出現問題,Clojure STM將重新開始操作。
想象一下沒有交易。您從ref-1中減去X金額,然後將該金額添加到ref-2之前,系統中出現問題。你的客戶不會感到滿意(如果你沒有被任何方式起訴)。

Clojure STM實施爲MVCC

原子另一方面不需要交易到位操作。沒有協調時原子很方便。例如,計數器可增加Web分析系統中訪問頁面的總數。

看一看Clojure Refs。它提供了很多有價值的信息。