Guarded Suspension Pattern就是“當訪問的共享資源被保護(防衛)時,那么線程就掛起”,生活中的例子就是當你和女朋友準備出去玩,你給女朋友打電話說該走了,女朋友說還沒準備好,那你只能等在那里知道你女朋友收拾好了才能出去:)。 相對Single Threaded Pattern的任何線程對共享資源的訪問僅僅是多個線程不能同時訪問unsafeMethod,Guared Suspension Pattern就稍微復雜點了,它有個概念就是“條件”。當共享資源的條件準備好時,才能讓其他線程進行訪問,如果條件沒有準備好,對不起,先等著吧。所以,這個模式里面還必須有一個改變“條件”使其成立的方法,還得有一個通知等待的線程不用再等的方法,否則,那些線程就在那里死等了...。 Guarded Suspension Pattern中對共享資源叫做Guarded Object(被防衛的對象),unsafeMethod方法稱之為guardedMethod。當線程執行guardedMethod方法時,只要滿足警戒條件,就會馬上執行。當警戒條件不成立時,就要開始等待。警戒條件的成立與否,會隨著Guarded Object狀態的變化而變化。 從代碼的角度看,如下:

class A{ 
    public synchronized void changeState(){ 
        改變狀態 通知等待的線程不同再等了(notify/notifyAll) 
    } 
    public synchronized void guardedMethod(){ 
        while(條件成立不成立){ 
            //這里不能是if,至于原因就好好想想吧:)(需要重點理解wait/notify/notifyAll的處理過程) 
            等著吧(wait) 
        } 進行處理 
    } 
} 

這種模式有一些變形: busy wait,即忙碌的等待。即在while循環中不用wait,而用yield;在changeState中不用notify/notifyAll。但是,這種變形的缺點是等待的線程仍然在運行,只不過一直在檢測運行時間是否滿足。

參考: 《Java多線程設計模式》,中國鐵道出版社,2005,結城浩


文章來源:http://localhost/wp2/?p=82