首頁 考試吧論壇 Exam8視線 考試商城 網(wǎng)絡課程 模擬考試 考友錄 實用文檔 繽紛校園 英語學習 | ||
2010考研 | 自學考試 | 成人高考 | 專 升 本 | 法律碩士 | MBA/MPA | 中 科 院 | ||
四六級 | 商務英語 | 公共英語 | 職稱日語 | 職稱英語 | 博思 | 口譯筆譯 | GRE GMAT | 日語 | 托福 | ||
雅思 | 專四專八 | 新概念 | 自考英語 | 零起點英、法、德、日、韓語 | 在職申碩英語 | ||
在職攻碩英語 | 成人英語三級 | ||
等級考試 | 水平考試 | 微軟認證 | 思科認證 | Oracle認證 | Linux認證 | ||
公務員 | 報關員 | 報檢員 | 外銷員 | 司法考試 | 導游考試 | 教師資格 | 國際商務師 | 跟單員 | ||
單證員 | 物流師 | 價格鑒證師 | 銀行從業(yè)資格 | 證券從業(yè)資格 | 人力資源管理師 | 管理咨詢師 | ||
期貨從業(yè)資格 | 社會工作者 | ||
會計職稱 | 注會CPA | 經(jīng)濟師 | 統(tǒng)計師 | 注冊稅務師 | 評估師 | 精算師 | 高會 | ACCA | 審計師 | ||
法律顧問 | 會計證 | ||
一級建造師 | 二級建造師 | 造價師 | 監(jiān)理師 | 安全師 | 咨詢師 | 結構師 | 建筑師 | 安全評價師 | ||
房地產(chǎn)估價師 | 土地估價師 | 設備監(jiān)理師 | 巖土工程師 | 質(zhì)量資格 | 房地產(chǎn)經(jīng)紀人 | 造價員 | ||
投資項目管理 | 土地代理人 | 環(huán)保師 | 環(huán)境影響評價 | 物業(yè)管理師 | 城市規(guī)劃師 | 公路監(jiān)理師 | ||
公路造價工程師 | 招標師 | ||
執(zhí)業(yè)護士 | 執(zhí)業(yè)醫(yī)師 | 執(zhí)業(yè)藥師 | 衛(wèi)生資格 |
上面描述的過程是線程間的互斥過程,同樣線程間的同步控制也離不開對象鎖,這一點從圖10-59中也可以很好地被反映出。例如,線程A處于運行狀態(tài)時,如果調(diào)用某個對象的wait()操作,線程A則進入阻塞的等待狀態(tài),并且線程A同時放棄擁有這個對象鎖(注意,線程A調(diào)用對象的wait()操作時,必須已經(jīng)擁有了該對象鎖)。此時系統(tǒng)中其它線程因此便可以有機會來獲取到這個對象鎖,并訪問這個共享對象。如果線程B調(diào)用了這個對象的notify()方法時,那么線程A將被喚醒,并且進入到查找鎖狀態(tài),如此不斷循環(huán)往復,以實現(xiàn)線程之間的同步控制。當然處于阻塞等待狀態(tài)中的線程,如果被外部中斷(interrupt)或被終止(stop)運行時,它也將會退出阻塞等待狀態(tài)。
從以上可以看出,JDK平臺中,線程之間互斥與同步的實現(xiàn),以及它的狀態(tài)轉(zhuǎn)換模型是非常嚴謹?shù),同時對于程序員而言,它也是比較容易理解掌握和易于使用的。另外在JDK平臺中線程庫模塊中,也有一個負責管理線程的創(chuàng)建、運行和銷毀等功能的實現(xiàn)類,那就是Thread類型。
2、 線程安全性設計
基礎庫系統(tǒng)中對多線程有了很好的支持,這無疑是一件很好的事情,但這同時也帶來了另一個比較棘手的設計問題。那就是基礎庫系統(tǒng)中,各組件模塊是否應該很好地支持線程安全,這非常非常重要,如果處理不當,輕則導致程序運行時數(shù)據(jù)信息的不一致,或業(yè)務的執(zhí)行錯誤;嚴重的話,將導致系統(tǒng)崩潰,而且設計不當也會很大程序上影響到程序的執(zhí)行效率。
比較典型例子,如C運行庫中的errno變量,這是一個在C庫中定義的全局性變量,用它來設置并指示,一些在系統(tǒng)調(diào)用時(或庫中的功能函數(shù)的執(zhí)行過程中)發(fā)生的錯誤信息。這在單線程工作環(huán)境的應用程序系統(tǒng)中并沒有什么問題,但是如果多線程工作環(huán)境下,則可能出現(xiàn)不一致的現(xiàn)象,有可能線程A剛設置的errno值被線程B覆蓋掉。怎樣很好地解決這個問題?使得C庫能很好地支持多線程的安全。較好的方法是利用線程本地存儲數(shù)據(jù)機制,也即利用每個線程都有一些只與自己線程相關的存儲信息。例如,每個線程的環(huán)境中都有一個errno變量,當線程切換時,線程本地存儲數(shù)據(jù)也隨之切換。
當然基礎庫中有其它更多不同種類的線程安全問題。如前面的章節(jié)中所闡述過的I/O平臺的線程安全等,還有JDK平臺中的SWING組件庫。這在設計上的確是遇到了一個兩難選擇的尷尬境地。如果基礎庫中的組件支持很好的線程安全性,那么它將會犧牲掉很多的運行效率;反過來也一樣存在很大的問題。怎么辦?現(xiàn)在大家取得基本共識的設計方案是比較傾向于后者,也即運行的效率。在保證基礎庫系統(tǒng)中的組件擁有最基本線程安全特性外,一般都把線程間的互斥與同步訪問控制權,交給用戶來掌握。