多線程支持和線程安全(2)

字號:

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