2009-08-20 97 views
0

我正在嘗試使Java應用程序線程安全。不幸的是,它最初是爲單用戶模式設計的,所有關鍵類都是以單例的形式實例化的。更糟的是,有一大堆接口用作常量容器和許多靜態字段。
在這種情況下,什麼會被認爲是一種好的做法?線程安全重構

  • 有一個單一入口點,這樣我就可以同步的是,只使用池(在某種程度上),但如果通話時間比平均一分鐘,隊列中的所有其他線程必須等待很長一段時間......
  • 由於測試代碼覆蓋率並不是最佳的,我不能確定是否忽略了某些內容,所以在這方面有一些關於不良實現模式的提示(類似於上面所述)會很有用。
  • 我知道最好的辦法是重寫整個結構,但這不是一個選項。

回答

0

@coldphusion,你必須閱讀/分析代碼。使用自動化工具,如果存在這樣的工具,就像在腳下自己拍攝一樣。

另外,並非所有東西都必須是線程安全的。如果一個對象永遠不會從多個線程訪問,則不需要使其對線程安全。如果一個對象是不可變的,那麼它已經是線程安全的。

準備好告訴你的老闆「不需要幾個小時或一天,即使你知道它,所以不要問。」

我推薦閱讀Java Concurrency In Practice

+0

就像我說的,我正在尋找一個例程手動執行它,而不是一個工具:)總是很難找到一個地方開始在這樣的sutiations。 感謝您的建議 - 我會看看它。 – user160048 2009-08-21 10:50:58

3

這聽起來不像是有一個快速解決這個問題。您應該從重構現有代碼開始,使用優秀的設計模式,並着眼於未來的多線程。清理完成後,將多線程作爲後續步驟執行。

0

正如Jonathan所說,聽起來不像是有一個快速解決方案。

你可以考慮使用ThreadLocal爲了提供專用的每線程單身人士。顯然,這可能或不可能取決於存儲在單例中的狀態,是否必須共享/維護等。

+0

我不想在Eclipse中尋找神奇的重構函數:)我對線程不安全的常見模式以及擺脫它們的正確方式感興趣。 特別是,如果有檢查線程安全的例程。在這一點上,我只能寫一個簡單的多線程測試啓動器,並等待一些測試失敗,這並不能保證良好的結果 – user160048 2009-08-20 14:56:04

0

我會加入@ nevermind的建議,因爲他/她提出了一些非常實用的觀點。

因爲沒有神奇的方法,所以要切實地去完成你的任務。您現有的代碼是否精心設計,可能只需要稍微更改,具體取決於它的使用方式。當然這也意味着完整的重新設計也可能是有序的。

沒有辦法在這裏任何人知道(除非他們寫的原代碼;-)

例如,如果您只需要進行訪問單個對象(單身或沒有)線程安全的,這是相當容易完成,可能對這樣的對象的調用者沒有任何編碼影響。另一方面,如果您需要一次修改多個對象以保持數據/狀態的完整性,那麼您的努力將會相當困難。

0

單身並不是壞事,只要不存儲任何狀態,不會違反線程安全。只要看看任何J2EE應用程序;很多單身人士,沒有任何國家(只提及其他無國籍的單身人士)。所有狀態都存儲在會話中;你可能會模仿,但正如其他人所說,沒有辦法自動改變你的應用程序;你將不得不作出一些很好的分析,以確定你將如何重構它以將所有無狀態bean從有狀態的bean中分離出來,也許在某些值對象中封裝狀態等。

0

如果有人對這個主題也感興趣 - 發現了一個關於「什麼(不)做」的非常詳細的tutorial - 帶有常見錯誤和最佳實踐。
不幸的是,它只有在德國atm:|