Semaphore自白:限流器用我就对了!(2)

简介: Semaphore自白:限流器用我就对了!(2)

项目经验


接下来,咱们使用代码的方式来演示 Semaphore 的使用。我们以停车场的限流为例,假设整个停车场只有 2 个车位(车位虽少,但足矣说明问题),但来停车的却有 5 辆车,显然车位不够用了,此时需要保证停车场最多只能有 2 辆车,接下来咱们使用 Semaphore 来实现车辆的限流功能,具体实现代码如下:


import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
/**
 * Author:磊哥
 * By:Java中文社群
 */
publicclass SemaphoreExample {
    // 创建信号量
    static Semaphore semaphore = new Semaphore(2);
    public static void main(String[] args) {
        // 创建 5 个固定的线程数
        ExecutorService threadPool = Executors.newFixedThreadPool(5);
        // 定义执行任务
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                // 拿到当前线程的名称
                String tname = Thread.currentThread().getName();
                System.out.println(String.format("老司机:%s,停车场外排队,时间:%s",
                        tname, new Date()));
                try {
                    // 执行此行,让所有线程先排队等待进入停车场
                    Thread.sleep(100);
                    // 执行阻塞
                    semaphore.acquire();
                    System.out.println(String.format("老司机:%s,已进入停车场,时间:%s",
                            tname, new Date()));
                    Thread.sleep(1000);
                    System.out.println(String.format("老司机:%s,离开停车场,时间:%s",
                            tname, new Date()));
                    // 释放锁
                    semaphore.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        // 执行任务 1
        threadPool.submit(runnable);
        // 执行任务 2
        threadPool.submit(runnable);
        // 执行任务 3
        threadPool.submit(runnable);
        // 执行任务 4
        threadPool.submit(runnable);
        // 执行任务 5
        threadPool.submit(runnable);
        // 等线程池任务执行完之后关闭
        threadPool.shutdown();
    }
}


以上代码的执行结果如下:


微信图片_20220120181101.jpg


从上述的结果我们可以看出,当有 5 辆车同时需要进入停车场时,因为停车场的停车位只有 2 个,所以停车场最多只能容纳 2 辆车。此时我们通过 Semaphore 的 acquire 方法(阻塞等待)和 release 方法(颁发一个证书)顺利的实现了限流的功能,让停车场的车辆数始终控制在 2 辆车以下(等于或小于 2 辆车)。

相关文章
|
6月前
|
监控 Sentinel 缓存
高并发架构设计三大利器:缓存、限流和降级问题之RateLimiter的acquire()方法有什么作用
高并发架构设计三大利器:缓存、限流和降级问题之RateLimiter的acquire()方法有什么作用
|
8月前
|
算法 安全
AtomicInteger使用非阻塞算法,实现并发控制多线程实现售票
AtomicInteger使用非阻塞算法,实现并发控制多线程实现售票
|
8月前
|
安全 Java 开发工具
Semaphore:实现一个限流器
Semaphore:实现一个限流器
74 0
|
存储 算法 NoSQL
关于高并发限流的详谈
高并发限流是在面对大量请求并发访问时,为了保护系统的稳定性和可用性,对请求进行限制和控制的一种技术手段。下面将详细介绍高并发限流的原理、常见的限流算法以及实现方法。
120 0
|
缓存 安全
深夜!小胖问我什么是读写锁?插队策略?升降级?(下)
深夜!小胖问我什么是读写锁?插队策略?升降级?
深夜!小胖问我什么是读写锁?插队策略?升降级?(下)
深夜!小胖问我什么是读写锁?插队策略?升降级?(上)
深夜!小胖问我什么是读写锁?插队策略?升降级?
深夜!小胖问我什么是读写锁?插队策略?升降级?(上)
|
Java
Semaphore自白:限流器用我就对了!(1)
Semaphore自白:限流器用我就对了!(1)
122 0
Semaphore自白:限流器用我就对了!(1)
|
设计模式 算法 Java
源码级深挖AQS队列同步器
源码级深挖AQS队列同步器
82 0
源码级深挖AQS队列同步器
Semaphore自白:限流器用我就对了!(3)
Semaphore自白:限流器用我就对了!(3)
97 0