2013-03-31 62 views
5

我正在通過java代碼讀取以確保它是線程安全的。如何分析Java源代碼並確保它是線程安全的

據我所知,該方法內的任何局部變量是線程安全的,因爲它屬於堆棧內存地址。任何類/實例變量都不是線程安全的,因爲它屬於堆內存,被其他線程共享。

根據經驗法則,我可以在觸及類變量的每個方法上放置一個synchronized關鍵字。

是否有任何eclipse插件或規則可以分析/防止多線程問題?

+1

是。 FindBugs可以執行這樣的分析。請看:http://stackoverflow.com/questions/2423266/thread-safety-framework – noahlz

+0

那麼,由線程創建並僅由該線程引用(例如,其引用是本地變量)的對象實例並非本質上與任何其他線程共享。 –

+0

我應該注意的其他一般「規則/要點」是什麼? – youcanlearnanything

回答

5

線程世界是一個好程序員最敏感的事情之一。每個解決線程問題的解決方案都需要大量的上下文知識。 任何插件都不夠「智能」,無法每次選擇最相關的解決方案。

實際上,​​代表每種可能解決方案的約5%。 思考併發集合,例如ConcurrentHashMap這是非常好的想法,並沒有使用它的基本大鎖=>更復雜的研究比這更多。

想想volatile,以確保障礙記憶,同時避免通過任何鎖定的任何種類的atomocity; 原子性不是它的作用,但在某些情況下,這將很好的避免它提高性能。

因此,忘記任何插件(即使一些可能存在的)線程安全的,但相信你的大腦;)

注:把​​關鍵字每個寫作課,是........ .ugly沒有談論性能差...

0

我不認爲eclipse會提供任何這樣的插件。隨着局部變量嘗試使用Immutable對象,ThreadLocals和大多數多線程問題將得到照顧。

0

我還沒有看到編譯時工具可以檢測到死鎖。這將很難模擬。我所知道的是some people have tried

您可以隨時在運行時檢測到它們。可以查詢JMX Beans以顯示此答案中解釋的死鎖線程 - Deadlock detection in Java

1

我不認爲有任何將明確檢查線程安全,有一些工具已被提及,如findbugs將做一個合理的工作發現明顯的錯誤。

這是非常由程序員,以確保他們的計劃沒有泄漏變量或引用到不同的線程,這裏的東西都是在多線程確保每個線程看到是「正確的」值使用。

設計演出前的安全,你可能會發現,它執行罰款您的需求,但如果你把優化你增加複雜性和潛在的故障,也可能不會最終被瓶頸。

我建議閱讀專門閱讀Java Concurrency In Practice,你也可以找到Effective Java有幫助。

0

更多的評論,但有點太長。

根據經驗法則,我可以在觸及類變量的每個方法上放置一個synchronized關鍵字。

不是真的 - 想想Vector類的例子:它是同步的,但迭代需要外部鎖定。例如,併發的副本是CopyOnWriteArrayList,它允許迭代而不需要鎖定整個集合。

底線已被其他人回答:它不像加入​​無處不在。您需要精確分析班級的合同,並確保合同在多線程情況下仍能實現。

相關問題