侧边栏壁纸
博主头像
ZHD的小窝博主等级

行动起来,活在当下

  • 累计撰写 79 篇文章
  • 累计创建 53 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Java 通过信号量方式接口限流

江南的风
2019-06-13 / 0 评论 / 0 点赞 / 16 阅读 / 3518 字 / 正在检测是否收录...

在Java中,实现接口的限流通常可以使用多种策略,其中信号量(Semaphore)是一种有效的并发控制工具,可以用于限制对共享资源的并发访问。信号量可以用来控制对接口的并发调用数,以避免系统过载或资源耗尽。

基本概念

信号量(Semaphore)是一个计数信号量,用于控制对共享资源的访问数量。它允许一个或多个线程同时访问某个特定资源,但具体数量由信号量的值决定。信号量的值表示当前可用的资源数量,当值为0时,表示没有可用资源,线程必须等待。

实现步骤

  1. 创建信号量:根据接口允许的最大并发数创建一个信号量实例。

  2. 在接口调用前获取信号量许可:在接口被调用之前,尝试从信号量中获取一个许可。如果没有可用的许可,调用线程将被阻塞,直到有许可可用。

  3. 在接口调用后释放信号量许可:接口调用完成后,无论成功还是失败,都应释放信号量中的许可,以便其他线程可以使用。

  4. 异常处理:确保在捕获到异常时也能释放信号量许可,避免资源泄露。

示例代码

以下是一个简单的使用信号量进行接口限流的Java示例:

import java.util.concurrent.Semaphore;  
  
public class RateLimiter {  
  
    private final Semaphore semaphore;  
  
    public RateLimiter(int permits) {  
        this.semaphore = new Semaphore(permits);  
    }  
  
    public void limitedAccess(Runnable task) throws InterruptedException {  
        // 获取许可  
        semaphore.acquire();  
        try {  
            // 执行任务  
            task.run();  
        } finally {  
            // 释放许可  
            semaphore.release();  
        }  
    }  
  
    public static void main(String[] args) {  
        RateLimiter rateLimiter = new RateLimiter(5); // 允许5个并发请求  
  
        for (int i = 0; i < 10; i++) {  
            new Thread(() -> {  
                try {  
                    rateLimiter.limitedAccess(() -> {  
                        // 模拟接口处理逻辑  
                        System.out.println(Thread.currentThread().getName() + " is processing.");  
                        Thread.sleep(1000); // 假设处理需要1秒  
                    });  
                } catch (InterruptedException e) {  
                    Thread.currentThread().interrupt();  
                }  
            }).start();  
        }  
    }  
}

在这个示例中,RateLimiter 类封装了一个信号量,并在 limitedAccess 方法中控制对传入 Runnable 任务的并发执行。我们创建了10个线程来模拟并发请求,但信号量只允许5个并发执行。当超过5个线程尝试执行时,它们将被阻塞,直到有许可可用。

注意事项

  • 使用信号量时,需要确保在 finally 块中释放许可,以避免资源泄露。

  • 信号量不适用于需要动态调整并发限制的场景,因为信号量的值在创建时是固定的。如果需要动态调整,可能需要考虑其他策略,如令牌桶或漏桶算法。

  • 信号量可以与其他同步机制(如锁)结合使用,以提供更复杂的并发控制策略。

0

评论区