我正在通過java代碼讀取以確保它是線程安全的。如何分析Java源代碼並確保它是線程安全的
據我所知,該方法內的任何局部變量是線程安全的,因爲它屬於堆棧內存地址。任何類/實例變量都不是線程安全的,因爲它屬於堆內存,被其他線程共享。
根據經驗法則,我可以在觸及類變量的每個方法上放置一個synchronized關鍵字。
是否有任何eclipse插件或規則可以分析/防止多線程問題?
我正在通過java代碼讀取以確保它是線程安全的。如何分析Java源代碼並確保它是線程安全的
據我所知,該方法內的任何局部變量是線程安全的,因爲它屬於堆棧內存地址。任何類/實例變量都不是線程安全的,因爲它屬於堆內存,被其他線程共享。
根據經驗法則,我可以在觸及類變量的每個方法上放置一個synchronized關鍵字。
是否有任何eclipse插件或規則可以分析/防止多線程問題?
線程世界是一個好程序員最敏感的事情之一。每個解決線程問題的解決方案都需要大量的上下文知識。 任何插件都不夠「智能」,無法每次選擇最相關的解決方案。
實際上,代表每種可能解決方案的約5%。 思考併發集合,例如ConcurrentHashMap
這是非常好的想法,並沒有使用它的基本大鎖=>更復雜的研究比這更多。
想想volatile
,以確保障礙記憶,同時避免通過任何鎖定的任何種類的atomocity; 原子性不是它的作用,但在某些情況下,這將很好的避免它提高性能。
因此,忘記任何插件(即使一些可能存在的)線程安全的,但相信你的大腦;)
注:把關鍵字每個寫作課,是........ .ugly沒有談論性能差...
我不認爲eclipse會提供任何這樣的插件。隨着局部變量嘗試使用Immutable對象,ThreadLocals和大多數多線程問題將得到照顧。
我還沒有看到編譯時工具可以檢測到死鎖。這將很難模擬。我所知道的是some people have tried。
您可以隨時在運行時檢測到它們。可以查詢JMX Beans以顯示此答案中解釋的死鎖線程 - Deadlock detection in Java。
我不認爲有任何將明確檢查線程安全,有一些工具已被提及,如findbugs將做一個合理的工作發現明顯的錯誤。
這是非常由程序員,以確保他們的計劃沒有泄漏變量或引用到不同的線程,這裏的東西都是在多線程確保每個線程看到是「正確的」值使用。
設計演出前的安全,你可能會發現,它執行罰款您的需求,但如果你把優化你增加複雜性和潛在的故障,也可能不會最終被瓶頸。
我建議閱讀專門閱讀Java Concurrency In Practice,你也可以找到Effective Java有幫助。
更多的評論,但有點太長。
根據經驗法則,我可以在觸及類變量的每個方法上放置一個synchronized關鍵字。
不是真的 - 想想Vector類的例子:它是同步的,但迭代需要外部鎖定。例如,併發的副本是CopyOnWriteArrayList,它允許迭代而不需要鎖定整個集合。
底線已被其他人回答:它不像加入無處不在。您需要精確分析班級的合同,並確保合同在多線程情況下仍能實現。
ThreadSafe(http://www.contemplateltd.com/threadsafe,免費試用)完全符合問題要求。請參閱InfoQ article瞭解它在包括Apache JMeter和K9Mail在內的開源應用程序中發現的併發錯誤的示例。用戶的意見見Ivan Senic's blog。 ThreadSafe's Wikipedia entry給出了一個簡要的總結。
(披露:ThreadSafe的是一個商業工具,我考慮的聯合創始人,產生它的公司)
是。 FindBugs可以執行這樣的分析。請看:http://stackoverflow.com/questions/2423266/thread-safety-framework – noahlz
那麼,由線程創建並僅由該線程引用(例如,其引用是本地變量)的對象實例並非本質上與任何其他線程共享。 –
我應該注意的其他一般「規則/要點」是什麼? – youcanlearnanything