張欽顧仰 鄧 迪 王 宇
(上海航天電子技術研究所,上海 200109)
近年來,智能終端設備取得了突飛猛進的發展,Android(以下稱安卓)系統可謂是頭號功臣,居功甚偉。2007年11月5日,谷歌公司首次向外界介紹了安卓系統,使得安卓系統可以進入大家的視野。它基于Linux系統開發,主要用于智能終端設備,例如平板電腦和智能手機。由于其完全開源,導致其傳播非常快,迅速占領了一半以上的市場占有率,成為當下最主流的智能終端設備操作系統。
隨著導彈遙測系統的通用化、小型化要求越來越高,基于ARM的平板電腦硬件平臺成為了新的選項之一。相較于過去的地面測試設備和筆記本的組合,手持平板設備有以下優點:
(1)體積小,便于攜帶,適應復雜多變的作戰環境;(2)成本低,更換方便,提供更好的后勤保障選擇;(3)智能一體化,具有更高的保密性和可靠性。
然而手持平板設備相比傳統筆記本也有一些不足,比如CPU等核心器件的性能沒有筆記本強大,所以為了達到使用要求必須同時使用多核CPU并行處理數據。這就面臨了Java開發中經常出現的高并發問題。為了解決單線程轉多線程帶來的高并發問題,讀寫鎖是一個很好的選擇。
與傳統順序執行程序相比,Java并發程序中多線程的線程安全一直是困擾廣大設計師的難題。通常Java在處理數據時都會把變量存在主內存,使用變量時都是把變量拷貝到自己的工作空間進行使用,待使用完后重新賦值回主內存。

圖1 Java內存訪問
但是如果是多核系統架構,就會產生風險。因為每個CPU核都擁有獨立的運算控制器,如果他們同時把同一個變量拷貝到線程內存進行計算,那么計算完成時,后一個線程的回歸值會覆蓋前一個線程的回歸值,造成共享變量不可見,導致出現臟數據和不可預期的結果。

圖2 多線程導致的共享變量不可見
當一個線程讀取內存時同步鎖會給該內存加鎖,直到訪問完畢之后釋放鎖。其他線程如果想要訪問,就會發現內存被鎖上,導致線程被堵塞。這樣做可以保證同時只有一個線程訪問,以此確保數據唯一性。

圖3 Synchronized獨占鎖
同步獨占鎖在保證數據唯一的情況下,會導致其他沒有獲取內部鎖的線程堵塞。如果程序寫入內存次數占比遠遠高于內存讀取次數,使用同步鎖可以有效規避高并發;但是一旦程序讀取內存次數占比遠遠高于內存寫入次數時,線程堵塞會大大影響性能。使用讀寫鎖可以有效解決這個問題。當運用讀寫鎖時,寫入加鎖,其他線程不能讀取和寫入,但是讀取加鎖時,其他線程只是不能寫入,不影響讀取操作,所以讀寫鎖本質上是一種可重入鎖。
由于遙測主要用于接收數據,導致其程序主要讀取數據,僅僅在判斷數據是否正確時需要寫入數據。而讀取操作并沒有必要使用同步鎖,所以讀寫鎖更適合。

圖4 Reentrant Read Write Lock結構
通過讀寫鎖的方法,對讀取和寫入分別設置一個內部鎖,大部分時間讀取鎖都解鎖,只在寫入時加鎖。并且加入了一個狀態機記錄其他的上鎖狀態的對應情況。
public Reentrant Read Write Lock(boolean fair){
sync=fair?new Fair Sync():new Non fair Sync();
reader Lock=new Read Lock(this);
writer Lock=new Write Lock(this);
}
/**Possible state transitions:
*NEW->COMPLETED->RECEIVE正常的上鎖狀態
*NEW->COMPLETED->LAUNCH其他的上鎖狀態
*NEW->STOP停止
*NEW->EXIT關閉
*NEW->INTERRUPTING->INTERRUPTED中斷
*/
private volatile int state;
private static final int RECEIVE=1;
private static final int LAUNCH=2;
private static final int INTERRUPTING=3;
private static final int STOP=4;
private static final int INTERRUPTED=5;
private static final int COMPLETED=6;
private static final int EXIT=7;
當遙測接收數據時,只讀取不寫入,狀態機state=1;當接收一段數據進行數據比對時,開啟寫入鎖,狀態機state=2。由于遙測接收寫入的數據不依賴于當前值,所以可以用volatile替代Synchronized,不僅不會影響線程調度,還能解決重排序問題。
通過分析讀取和寫入的高低權重,將權重排序并分別加鎖和解鎖,做到優先處理高權重請求,優化處理流程的同時保證數據的唯一,并且在出現異常的時候提供中斷功能,確保遙測監控的安全。
本文在同步鎖的基礎上,討論了運用讀寫鎖原理解決ARM芯片多線程高并發的問題,為導彈遙測接收端移植平臺實現小型化提供新的思路和新的方法,為將來的導彈適應多環境高機動作戰提供可行性。
[1]鄭逸凡.高并發網站的前端優化技術研究[J].通化師范學院學報,2015(08):12-14.
[2]陳涵生.Java語言與Java技術[J].計算機工程,1997(04):3-6.
[3]丁衛峰.亦步亦趨的代碼移植——從Linux到Windows的代碼移植[J].程序員:CSDN開發高手,2004(2):93-96.
[4]吉建平.選取我國代碼制圖文電視糾錯碼的幾點考慮[J].廣播與電視技術,1988(03):26-31,35.