2013-04-17 22 views
1

我試圖說服自己clojure確實比java更容易併發編程。是Clojure Refs/do-sync只是相當於java的「synchronized」塊嗎?

但我覺得Clojure的參考文獻/做同步幾乎是完全一樣的Java「同步」塊。然後我讀這個線程:Clojure STM (dosync) x Java synchronize block

---我重新啓動一個新的線程,因爲如果我在舊線程評論那裏,響應可能不高,由於年老。

在該線程由米哈爾Marczyk第一評論聲稱,DIFF是Java同步塊使用鎖定而Clojure的使用事務。我認爲這個說法並沒有涉及問題的實質:在底層,事務仍然通過鎖來實現。所以「java使用鎖」不是Clojure更好的原因。

我認爲真正的好處是Clojure交易自動管理鎖,就像數據庫交易一樣。這樣,獲取鎖的順序以及事務處理的順序由事務管理器決定,以便程序員不需要關心它,而在Java世界中,程序員必須明確地選擇使用哪個鎖同步塊,這會導致可能的死鎖。事務管理器可以使用2階段鎖定來避免死鎖。

做上述有意義嗎?

感謝 楊

回答

6

參考在Clojure是一個不同的併發抽象,它就像一個數據庫事務 - 它具有原子性,一致性和隔離性能。它建立在JVM鎖定機制之上,因此可以用Java自己實現它。我們不這樣做的原因是,像編號機制要求等不平凡的機制,以預先實施:

+1

+1。也加入我自己的答案,因爲這是我的老問題,這個問題已經明確地提出來了,還有一些額外的評論我想提出。 –

5

作者 - 讓我嘗試和闡述:

在第t實際上他引用了我首先聲明的答案,首先,「dosync和​​可以訪問完全不同的併發抽象」。此外,我描述​​不僅僅是「使用鎖」,而是「獲取和釋放鎖的一種方式」。

換句話說,而STM肯定是使用在引擎蓋下的鎖,它暴露可思索這樣事務語義;例如,它沒有通過構建造成的死鎖(然而,活鎖是可能的)。相比之下,​​顯然沒有什麼比程序員聲明這樣一個對象的監視器要在大括號標記的點上被獲取和釋放的方式更多或更少。這裏的重要區別是關於語義,而不是實現。

此外,還有比管理鎖定爲了更STM;有MVCC,由格熱戈日提到,有自動重啓交易,有ensurecommute(控制與一致性併發權衡,如果你願意的話),STM和代理之間就有了合作(如果從事務內部調用,代理動作放在隊列中,send只在提交時被分派)。

因此,STM是一種管理鎖的機制當然是正確的,並且將它描述爲是有用的;但更大的一面是,STM實現使用它需要的任何內部細節,包括鎖,以便爲程序員提供另一種併發抽象,合理無泄漏,最終必須如此來處理,如果要從中提取完整的好處它。

相關問題