我正試圖從網站上提供的API和文檔學習Clojure。我對Clojure中的可變存儲有點不清楚,我想確保我的理解是正確的。請讓我知道是否有任何我錯誤的想法。Clojure可變的存儲類型
編輯:我正在更新這個,因爲我收到了關於其正確性的評論。
免責聲明:所有這些信息是非正式的和潛在的錯誤。不要使用這篇文章來了解Clojure的工作原理。
瓦爾總是包含一個根結合和可能的每線程結合。它們與命令式語言中的常規變量相當,不適合在線程之間共享信息。 (感謝亞瑟Ulfeldt)
參考文獻被所在地支持,可以改變在單個事務中的任何數目的參考文獻的狀態原子事務的線程之間共享。在退出同步表達式(dosync)時進行事務處理,並使用STM魔法自動解決衝突(回退,隊列,等待等)。調度獨立的行動功能來改變代理的狀態。代理程序立即返回,因此是非阻塞的,儘管代理程序的值在調度函數完成之前未設置。
原子是可以在線程之間同步共享的位置。它們支持不同線程之間的安全操作。
下面是我總結的友好基於何時使用這些結構:
- 瓦爾像在命令式語言普通的舊變量。 (儘可能避免)
- 原子就像瓦爾,但線程共享安全,允許立即閱讀和安全設置。 (謝謝馬丁)
- 一個代理就像一個Atom,而不是阻塞它產生一個新的線程來計算它的值,只有在更改值的過程中阻塞,並且可以讓其他線程知道它已完成分配。
- 參考是共享位置,將自己鎖定在交易中。我們只是啓動一個事務,讓Clojure處理該事務中引用的所有鎖定條件,而不是讓程序員決定在競爭條件下發生的每一段鎖定代碼。
而且,相關的概念是功能future
。對我來說,似乎未來的對象可以被描述爲一個同步代理,其中在計算完成之前根本無法訪問該值。它也可以被描述爲一個無阻塞的Atom。這些準確的未來的概念?
之前,你很清楚地解釋這些修正,謝謝!根綁定的想法讓我感到困惑,因爲我沒有看到它的任何優勢。我認爲這是因爲更多的技術原因,例如讓可變變量離開堆棧,所以它們不會被釋放。 – Kai 2009-06-22 17:27:15