Guarded Suspension Pattern就是“當(dāng)訪問的共享資源被保護(hù)(防衛(wèi))時(shí),那么線程就掛起”,生活中的例子就是當(dāng)你和女朋友準(zhǔn)備出去玩,你給女朋友打電話說該走了,女朋友說還沒準(zhǔn)備好,那你只能等在那里知道你女朋友收拾好了才能出去:)。 相對(duì)Single Threaded Pattern的任何線程對(duì)共享資源的訪問僅僅是多個(gè)線程不能同時(shí)訪問unsafeMethod,Guared Suspension Pattern就稍微復(fù)雜點(diǎn)了,它有個(gè)概念就是“條件”。當(dāng)共享資源的條件準(zhǔn)備好時(shí),才能讓其他線程進(jìn)行訪問,如果條件沒有準(zhǔn)備好,對(duì)不起,先等著吧。所以,這個(gè)模式里面還必須有一個(gè)改變“條件”使其成立的方法,還得有一個(gè)通知等待的線程不用再等的方法,否則,那些線程就在那里死等了...。 Guarded Suspension Pattern中對(duì)共享資源叫做Guarded Object(被防衛(wèi)的對(duì)象),unsafeMethod方法稱之為guardedMethod。當(dāng)線程執(zhí)行g(shù)uardedMethod方法時(shí),只要滿足警戒條件,就會(huì)馬上執(zhí)行。當(dāng)警戒條件不成立時(shí),就要開始等待。警戒條件的成立與否,會(huì)隨著Guarded Object狀態(tài)的變化而變化。 從代碼的角度看,如下:
class A{
public synchronized void changeState(){
改變狀態(tài) 通知等待的線程不同再等了(notify/notifyAll)
}
public synchronized void guardedMethod(){
while(條件成立不成立){
//這里不能是if,至于原因就好好想想吧:)(需要重點(diǎn)理解wait/notify/notifyAll的處理過程)
等著吧(wait)
} 進(jìn)行處理
}
}
這種模式有一些變形: busy wait,即忙碌的等待。即在while循環(huán)中不用wait,而用yield;在changeState中不用notify/notifyAll。但是,這種變形的缺點(diǎn)是等待的線程仍然在運(yùn)行,只不過一直在檢測(cè)運(yùn)行時(shí)間是否滿足。
參考: 《Java多線程設(shè)計(jì)模式》,中國(guó)鐵道出版社,2005,結(jié)城浩
文章來源:http://localhost/wp2/?p=82