- Java多線程編程實(shí)戰(zhàn)指南:設(shè)計(jì)模式篇(第2版)
- 黃文海
- 923字
- 2021-10-15 19:24:55
3.3 Immutable Object模式實(shí)戰(zhàn)案例解析
某彩信網(wǎng)關(guān)系統(tǒng)在處理由增值業(yè)務(wù)提供商(VASP,Value-Added Service Provider)下發(fā)給手機(jī)終端用戶的彩信消息時(shí),需要根據(jù)彩信接收方號(hào)碼的前綴(如1381234)選擇對(duì)應(yīng)的彩信中心(MMSC,Multimedia Messaging Service Center),然后轉(zhuǎn)發(fā)消息給選中的彩信中心,由其負(fù)責(zé)對(duì)接電信網(wǎng)絡(luò)并將彩信消息下發(fā)給手機(jī)終端用戶。彩信中心相對(duì)于彩信網(wǎng)關(guān)系統(tǒng)而言,是一個(gè)獨(dú)立的部件,二者通過網(wǎng)絡(luò)進(jìn)行交互。這個(gè)選擇彩信中心的過程,我們稱之為路由(Routing),而手機(jī)號(hào)前綴和彩信中心的這種對(duì)應(yīng)關(guān)系,我們稱之為路由表。路由表在軟件運(yùn)維過程中可能發(fā)生變化,例如,業(yè)務(wù)擴(kuò)容帶來的新增彩信中心、為某個(gè)號(hào)碼前綴指定新的彩信中心等。雖然路由表在該系統(tǒng)中是由多線程共享的數(shù)據(jù),但是這些數(shù)據(jù)的變化頻率并不高。因此,即使是為了保證線程安全,我們也不希望對(duì)這些數(shù)據(jù)的訪問進(jìn)行加鎖等并發(fā)訪問控制,以免產(chǎn)生不必要的開銷和問題。這時(shí),Immutable Object模式就派上用場了。
維護(hù)路由表可以被建模為一個(gè)不可變對(duì)象,如清單3-4所示。
清單3-4 使用不可變對(duì)象維護(hù)路由表

而彩信中心的相關(guān)數(shù)據(jù),如彩信中心設(shè)備編號(hào)、URL、支持的最大附件大小,也被建模為一個(gè)不可變對(duì)象,如清單3-5所示。
清單3-5 使用不可變對(duì)象表示彩信中心的相關(guān)數(shù)據(jù)

彩信中心信息變更的頻率也同樣不高。因此,當(dāng)通過網(wǎng)絡(luò)(Socket連接)通知彩信網(wǎng)關(guān)系統(tǒng)這種彩信中心信息本身或者路由表變更時(shí),網(wǎng)關(guān)系統(tǒng)會(huì)重新生成MMSCInfo和MMSCRouter來反映這種變更,如清單3-6所示。
清單3-6 處理彩信中心信息、路由表的變更

上述代碼會(huì)調(diào)用MMSCRouter的setInstance方法將MMSCRouter實(shí)例替換為新創(chuàng)建的實(shí)例。而新創(chuàng)建的MMSCRouter實(shí)例會(huì)通過其構(gòu)造器生成多個(gè)新的MMSCInfo實(shí)例。
在本案例中,MMSCInfo是一個(gè)嚴(yán)格意義上的不可變對(duì)象。雖然MMSCRouter對(duì)外提供了setInstance方法來改變其靜態(tài)字段instance的值,但它仍然可被視作一個(gè)等效的不可變對(duì)象。這是因?yàn)閟etInstance方法僅僅改變了instance變量指向的對(duì)象,而instance變量采用volatile關(guān)鍵字修飾,保證了其在多線程之間的內(nèi)存可見性,所以這意味著setInstance方法對(duì)instance變量的改變無須加鎖也能保證線程安全。而其他代碼在通過調(diào)用MMSCRouter的相關(guān)方法獲取路由信息時(shí)也無須加鎖。
從圖3-1的類圖來看,OMCAgent類(見清單3-6)是一個(gè)Manipulator參與者實(shí)例,而MMSCInfo、MMSCRouter是一個(gè)ImmutableObject參與者實(shí)例。通過使用不可變對(duì)象,我們既可以應(yīng)對(duì)路由表、彩信中心信息中不是非常頻繁的變更,也可以使系統(tǒng)中使用路由表的代碼免受并發(fā)訪問控制的開銷和問題。
- LabVIEW2018中文版 虛擬儀器程序設(shè)計(jì)自學(xué)手冊(cè)
- Boost C++ Application Development Cookbook(Second Edition)
- SQL Server 2012數(shù)據(jù)庫技術(shù)及應(yīng)用(微課版·第5版)
- jQuery EasyUI網(wǎng)站開發(fā)實(shí)戰(zhàn)
- Reactive Programming with Swift
- 精通搜索分析
- R語言數(shù)據(jù)可視化實(shí)戰(zhàn)
- SQL Server 2016數(shù)據(jù)庫應(yīng)用與開發(fā)習(xí)題解答與上機(jī)指導(dǎo)
- Mastering Unity 2D Game Development(Second Edition)
- R數(shù)據(jù)科學(xué)實(shí)戰(zhàn):工具詳解與案例分析
- Java EE企業(yè)級(jí)應(yīng)用開發(fā)教程(Spring+Spring MVC+MyBatis)
- Python青少年趣味編程
- H5+移動(dòng)營銷設(shè)計(jì)寶典
- 零基礎(chǔ)學(xué)編程系列(全5冊(cè))
- Java程序設(shè)計(jì)及應(yīng)用開發(fā)