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