Java高并发编程详解系列-Guarded Suspension设计模式
程序员文章站
2024-03-21 16:54:10
...
导语
什么是Guarded Suspension模式,Suspension 意思是挂起,暂停的。而Guarded则表示担保的意思,连起来的就是确保挂起。也就是说当线程访问某个对象的时候,发现条件不满足,就暂时挂起等待条件满足的时候再次发起访问,这一点与Balking设计模式正好是相反的(Balking在遇到条件不满足的时候回放弃)。在Java并发包中BlockingQueue大量的使用了Guarded Suspension设计模式
Guarded Suspension设计模式
Guarded Suspension 示例
public class GuardedSuspensionQueue {
//定义存放Integer类型的Queue
private final LinkedList<Integer> queue = new LinkedList<>();
//定义queue的最大容量为100
private final int LIMIT = 100;
//向queue中插入数据,如果queue中的元素超过最大容量,则会陷入阻塞
public void offer(Integer data) throws InterruptedException {
synchronized (this){
//判断queue的当前元素是否超过LIMIT
while (queue.size()>=LIMIT){
//当前线程进入到阻塞
this.wait();
}
//插入元素并呼气take线程
queue.addLast(data);
this.notifyAll();
}
}
//从队列中获取元素,如果队列此时为空,自会使得当前线程阻塞
public Integer take() throws InterruptedException {
synchronized(this){
//如果队列为空
while (queue.isEmpty()){
//则挂起当前线程
this.wait();
}
//通知offer线程可以继续插入数据
this.notifyAll();
return queue.removeFirst();
}
}
}
在GuardedSuspensionQueue中,需要保证线程安全的地方是queue,分别在take方法和offer方法中对应的临界值为空或者100的时候,当queue中的数据已经满了,如果线程调用了offer方法则会被挂起,同样的如果当这个queue没有数据的时候会调用take方法也会被挂起。
Guarded Suspension设计模式是一个比较基础的设计模式,它关注的是当某个条件不满足时候的操作,防止了数据不一致或者是超过临界值的控制范围
对于数据操作的空间就只有蓝色部分的内存,如果queue队列中的数据满的时候则整体进入到挂起状态,当然为空的时候也是相同的效果,这样可以保证了queue的高效利用率
总结
相对来说Guarded Suspension设计模式并不是一个复杂的模式而是比较简单的一个模式,从上面例子中可以看出使用也相对比较简单。
下一篇: MySQL基础知识——AND&OR