JDK平臺(tái)中自己實(shí)現(xiàn)了的一套更為完善的線程模型,因此它的這套線程模型是可能獨(dú)立于,也有區(qū)別于操作系統(tǒng)實(shí)現(xiàn)的線程模型。如圖10-58所示,它包含的狀態(tài)有運(yùn)行(Running)、就緒(Ready)、暫停(Suspended)、休眠(Sleeping)、阻塞(Blocked)以及監(jiān)控狀態(tài)(Monitor States)。這其中線程的運(yùn)行狀態(tài)、就緒狀態(tài)、暫停狀態(tài)、休眠狀態(tài)以及阻塞狀態(tài)都比較容易理解,另外有一個(gè)比較特殊的線程狀態(tài),也即監(jiān)控狀態(tài),它表示線程正處于查詢對(duì)象鎖的管理狀態(tài)下,稍后會(huì)繼續(xù)深入闡述這一特殊的狀態(tài)。
JDK平臺(tái)中,線程之間的互斥控制非常易于實(shí)現(xiàn),因?yàn)镴ava語言對(duì)它有很好的支持,也即通過語言關(guān)鍵字synchronized來定義一個(gè)互斥訪問的臨界區(qū)。關(guān)鍵字synchronized的使用非常靈活,它定義的臨界區(qū)資源的顆粒度可大可小,例如可以聲明某個(gè)類的某個(gè)方法是被互斥訪問的臨界區(qū),也可以定義某個(gè)局部作用域?yàn)橐粋(gè)臨界區(qū),甚至可以直接鎖定某個(gè)對(duì)象為臨界區(qū)資源。
而JDK平臺(tái)中線程之間的同步控制,是通過wait()和notify()方法來實(shí)現(xiàn)的,實(shí)際上wait()方法的調(diào)用相當(dāng)于執(zhí)行P操作,而notify()方法的調(diào)用則相當(dāng)于操作V,有關(guān)P,V操作的概念,請(qǐng)參閱操作系統(tǒng)中關(guān)于進(jìn)程間的同步控制與通信設(shè)計(jì)等小節(jié)中的內(nèi)容。另外為了提高安全性,JDK平臺(tái)中還定義了一個(gè)notifyAll()的方法,它用于通知并釋放所有處于阻塞等待狀態(tài)中的線程,便于這些線程有機(jī)會(huì)重新獲得退出的機(jī)會(huì),避免了一些不必要的死鎖。
MFC中擁有一些專門實(shí)現(xiàn)線程間互斥和同步控制的對(duì)象,而與這形成鮮明對(duì)比的是,JDK平臺(tái)中則沒有提供這些類似的專有控制對(duì)象,這非常有意思,實(shí)際上JDK平臺(tái)中的wait()和notify()方法是Object類(根基類)對(duì)象所提供的方法實(shí)現(xiàn),所以說,程序中所有對(duì)象的運(yùn)行實(shí)例都擁有wait()和notify()方法。并且它的同步與互斥有著非常緊密的聯(lián)系,如圖10-59所示,這是JDK平臺(tái)中線程之間互斥與同步的轉(zhuǎn)換模型。
轉(zhuǎn)帖于:軟件水平考試_考試吧
版權(quán)聲明 --------------------------------------------------------------------------------------
如果
軟件水平考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請(qǐng)與我們聯(lián)系
,我們將會(huì)及時(shí)處理。如轉(zhuǎn)載本
軟件水平考試網(wǎng)內(nèi)容,請(qǐng)注明出處。