《面向模式的软件体系结构2-用于并发和网络化对象模式》读书笔记(12)--- 策略化加锁...
4.2策略化加鎖(Strategized Locking)
1.問題
? ? ? 運行在多線程環境中的組件必須保護其臨界區不被客戶機并發訪問。同步機制與組件功能的集成需要解決以下兩個強制條件:
? ? ? 1)不同的應用程序可能要求不同的同步策略,如互斥、讀寫鎖或信息燈。因此,應該可以按照具體應用的需求定制組件的同步機制。
? ? ? 2)加入新的功能和隱錯修正應很容易。特別為避免“版本混亂”應始終將這些變化一致地自動地應用于組件系列的所有成員上。
?
2.解決方案
? ? ? 將組件的同步特性變成“可插”的類型,用這種方式將組件的同步特性參數化。每種類型將特定的同步化策略對象化,同步策略包括互斥、讀寫鎖、信號燈或“空”鎖等。將這些可插的類型的實例定義為包含在組件中的對象,該組件可以使用這些對象有效地使其方法實現同步化。
?
3.實現
1)不考慮組件的同步特性,定義組件的接口和實現。
2)將加鎖機制策略化。許多組件有相對簡單的同步特性,可以使用常用的加鎖策略,如互斥和信號燈等實現這些同步特性。可以統一地使用多態性或參數化類型將同步特性策略化。一般來說,如果直到運行時才知道加鎖策略,就應該使用多態性。相反,如果在編譯時就知道加鎖策略,那就應該使用參數化類型。參數化類型有運行效率高的特點,而多態性有運行時可擴展的潛力。
? ? ? 假設使用定界加鎖慣用法,策略化鎖包括兩個子活動:
? ? ? 2.1)為加鎖機制定義一個抽象接口。為了使組件能使用不同的加鎖機制,這些機制的所有具體實現應該使用具有共同特征的抽象接口,用于在多態性或參數化類型的基礎上獲取和釋放鎖。
? ? ? 2.2)使用定界加鎖慣用法定義一個用同步特征將其策略化的哨兵類。這種設計遵循策略模式。其中,哨兵類作為擁有某一特殊鎖的語境,而具體鎖提供策略。
3)更新組件的接口和實現。在策略化同步機制后,組件可以使用這些機制,通過顯式地獲得或釋放一個鎖,或者使用定義的哨兵類來保護臨界區。
4)修改組件實現以避免死鎖和刪除不必要的加鎖開銷。如果組件間存在方法調用,那么開發人員必須仔細地設計其組件實現,以避免自死鎖和不必要的同步開銷。
5)定義一組具有統一接口的加鎖策略,這些策略可以支持各種應用特定的并發設計。
?
4.結論
優點:
? ? ? 1)增加靈活性和個性化。為特定的并發模型配置和定制一個組件是很容易的,因為組件的同步特性被策略化了。如果對于一種新的并發模型沒有合適的加鎖策略可用,可以在不影響已有代碼的情況下擴充新的加鎖策略。
? ? ? 2)降低組件維護的代價。使用策略化加鎖模式很容易改進組件和隱錯修正,因為對于各種并發模型只有一個實現,而不是每種并發模型對應一個獨立的實現。將問題集中的方法有助于減少版本混亂。
? ? ? 3)改善重用性。用這種模式實現的組件不太依賴于具體的同步機制。
?
不足:
? ? ? 1)強行(obtrusive)加鎖。
? ? ? 2)過分工程化(over-engineering)。?
轉載于:https://www.cnblogs.com/pennant/archive/2012/09/23/2698948.html
總結
以上是生活随笔為你收集整理的《面向模式的软件体系结构2-用于并发和网络化对象模式》读书笔记(12)--- 策略化加锁...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏开发随想之2D游戏架构
- 下一篇: Asp.net mvc4用JQuery插