Guarded Suspension模式
- -如果执行现在的处理会出现问题,那么就让执行处理的线程进行等待
1、守护条件(前置条件)是什么?
在执行目标处理前必须满足的条件称之为守护(前置)条件
2、该模式登场的角色
GuardedObject:被守护的对象,持有一个被守护的方法guardedMethod,当线程执行该方法时,若守护条件成立,则立即执行,否则就要进行等待。guardedMethod通过while和wait()实现,而状态改变方法则通过notify/notifyAll来实现
上图中的意思是:如果队列中存在请求,就执行remove()获取请求,没有请求则持续陷入等待状态。知道通过下图改变队列状态
3、该模式的特点:①存在循环②存在条件检查③因为某种原因而“等待”
4、如果忘记唤醒了怎么办?设置超时时间。
5、该模式和自旋锁的机制有异曲同工之妙
6、最佳实践 BlockingQueue阻塞队列
public Request getRequest() {
Request req = null;
try {
req = queue.take();
} catch (InterruptedException e) {
}
return req;
}
public void putRequest(Request request) {
try {
queue.put(request);
} catch (InterruptedException e) {
}
}
put方法加入请求,take方法内部实现,非常精妙
public E takeFirst() throws InterruptedException {
final ReentrantLock lock = this.lock;
lock.lock();
try {
E x;
while ( (x = unlinkFirst()) == null)
notEmpty.await();
return x;
} finally {
lock.unlock();
}
}
应用场景参考
https://blog.csdn.net/luzhensmart/article/details/81712583