欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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设计模式是一个比较基础的设计模式,它关注的是当某个条件不满足时候的操作,防止了数据不一致或者是超过临界值的控制范围
Java高并发编程详解系列-Guarded Suspension设计模式
  对于数据操作的空间就只有蓝色部分的内存,如果queue队列中的数据满的时候则整体进入到挂起状态,当然为空的时候也是相同的效果,这样可以保证了queue的高效利用率

总结

  相对来说Guarded Suspension设计模式并不是一个复杂的模式而是比较简单的一个模式,从上面例子中可以看出使用也相对比较简单。

相关标签: 高并发