gpt4 book ai didi

Guarded Suspension 设计模式

转载 作者:知者 更新时间:2024-03-13 01:48:40 27 4
gpt4 key购买 nike

一 点睛

当线程在访问某个对象时,发现条件不满足,就暂时挂起等待条件满足时再次访问,这就是 Guarded Suspension 设计模式。该设计模式的关注点在于临界值的条件是否满足,当达到设置的临界值时相关线程则会挂起。

二 代码

package concurrent;

import java.util.LinkedList;

public class GuardSuspensionQueue {
    // 定义存放 Integer 类型的 queue
    private final LinkedList<Integer> queue = new LinkedList<>();
    // 定义 queue 的最大容量
    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();
        }
    }
}

三 说明

在 GuardSuspensionQueue 中,需要保证线程安全的是 queue,分别在 take 和 offer 方法中对应的临界值是 queue 为空和 queue 的数量 >= 100,当 queue 中的数据已经满时,如果有线程调用 offer 方法则会被挂起(Suspension),同样,当 queue 没有数据的时候,调用 take 方法也会被挂起。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com