簡體   English   中英

線程安全重構

[英]Thread-safety refactoring

我正在嘗試使Java應用程序成為線程安全的。 不幸的是,它最初是為單用戶模式設計的,所有鍵類都被實例化為單例。 更糟糕的是,有一堆接口充當常量容器和許多靜態字段。
在這種情況下,什么被視為良好做法?

  • 只有一個入口點,所以我可以同步它並只使用緩沖池(某種),但是如果調用平均花費超過一分鍾,則隊列中的所有其他線程將不得不等待很長時間...
  • 由於測試代碼的覆蓋范圍不是很理想,並且我不確定我是否忽略了某些內容,因此有關此區域中不良實現模式(類似於上述模式)的一些提示會很有用。
  • 我知道最好的辦法是重寫整個結構,但這不是一個選擇。

聽起來好像沒有快速解決方案。 您可能應該首先重構現有代碼以使用良好的設計模式,並着眼於將來對其進行多線程處理。 在清理完多線程之后,請稍后實施它。

正如喬納森(Jonathan)所提到的那樣,聽起來好像並沒有解決之道。

您可以考慮使用ThreadLocal以便提供專用的每個線程單例。 顯然,這可能會或可能不會,這取決於單例內存在的狀態,是否必須共享/維護等。

@coldphusion,您必須閱讀/分析代碼。 如果存在這樣的工具,使用自動化工具就好比用腳砸自己。

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

准備好告訴老板:“即使您知道,也不會花費數小時或一天的時間,所以請不要問。”

我建議閱讀《 實踐Java並發》

我會補充@nevermind的建議,因為他/她提出了一些非常實際的觀點。

因為沒有神奇的方法,所以對要完成任務需要更改的內容要切合實際。 您現有的代碼(無論設計與否)可能僅需進行少量更改,具體取決於使用方式。 當然,這也意味着可能需要進行徹底的重新設計。

這里沒有任何人知道(除非他們寫了原始代碼;-)

例如,如果您只需要訪問單個對象(無論是單個對象還是非對象)都是線程安全的,則這很容易實現,可能不會對此類對象的調用者產生任何編碼影響。

另一方面,如果您需要一次修改多個對象以保持數據/狀態的完整性,那么您的工作將非常困難。

單例並不是一件壞事,只要它們不存儲任何狀態,就不會違反線程安全性。 只需查看任何J2EE應用即可; 很多單例,沒有任何狀態(僅引用其他無狀態單例)。 所有狀態都存儲在會話中; 您可能會模仿,但是正如其他人所說,無法自動轉換您的應用程序; 您將必須進行一些良好的分析,以確定如何重構它以將所有無狀態bean與有狀態bean分開,也許將狀態封裝在某些值對象中,等等。

如果有人也對該主題感興趣-我找到了一個關於“做什么(不做)”的非常詳細的教程 -具有常見的錯誤和最佳實踐。
不幸的是,它僅在德語atm中可用:|

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM