2014-01-15 26 views
5

我正在研究clojure庫,當我注意到一個可變字段被註釋爲^:unsynchronized-mutable。易變是可變的,但我不知道是什麼不同步部分的意思,所以我讀了docs,其中包含:什麼是語義含義:volatile-mutable與:unynchronized-mutable?

說明清楚,易變的領域是非常困難的正確使用 ,並且只存在於便於在Clojure 本身中構建更高級別的構造,如Clojure的參考類型。它們僅供專家使用 - 如果volatile-mutable或:unsynchronized-mutable的語義和影響 不是立即顯示給您的 ,則不應使用它們。

我無法得到細微差別:它是否說在實踐中,我選擇哪個可變性註釋或人們應該忘記使用可變類型?

而且,爲了好奇,在較低的抽象層次上,它們之間的語義差異是什麼?

謝謝!

+3

這肯定是說你應該不** **使用可變領域。 – Chuck

+0

現在,源代碼示例的鏈接已被破壞,但對於任何人現在想知道警告的來源,它在['deftype'](http://clojuredocs.org/clojure.core/deftype)的文檔字符串中。 – Mars

回答

2

嗯,這並不是說「人」應該忘記使用可變類型。這就是說,任何使用它們的人都應該知道非同步和不穩定的區別(並且暗示這不是Clojure特有的問題,否則會在文檔字符串中解釋)。我不知道一個明確的解釋,但在使用Clojure的可變deftype字段之前,您應該瞭解Java內存模型,以及一般的線程和同步。

我沒有明確的參考資料,但維基百科似乎有關於該主題的useful article(我剛發現它,並且只是剔除它)。

+0

我認爲這比「任何使用它們的人都應該知道區別」都要進一步。它的確這麼說,但它也表示它們只存在於構建更高層次的構造中,在大多數情況下,這對我來說是一種非常強烈的挫折,即使是那些瞭解這兩種類型的影響的人也是如此。 – Chuck

1

這是說,如果你不明白:volatile-mutable:unsynchronized-mutable之間的區別,你應該使用Clojure的引用類型,而不是直接使用可變字段。

這兩種可變性具有不同的策略來保證共享可變數據的線程之間的一致性,並且這導致讀/寫操作的不同性能。有時你可以通過微調使用某種特定的可變性來獲得更好的性能。如果你天真地使用它們,你會變得奇怪而難以理解。

2

這些是java結構,這就是爲什麼你不會在clojure文檔中的任何地方看到它們,除非'不要使用這個'。

對於聲明爲'volatile'的所有變量,讀取和寫入是原子的。

未同步的字段是常規的Java可變字段。

https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html

實事求是地講,這意味着,如果你有一個數據結構,當多個線程訪問數據進行讀取或寫入揮發性目標將始終是一致的;也就是說,您將始終從完全在數據操作之前或完全在該數據操作之後獲取數據對象。

對不起,如果這不能100%的感覺;語義複雜;如果您想深入瞭解,請閱讀以下內容:When exactly do you use the volatile keyword in Java?

tldr;

揮發性略低於未同步;但它提供了更好的跨線程數據保證。

避免他們兩個,如果你可以,但如果你需要使用一個,你可能想:volatile-mutable