呵,Semaphore ,就这?(一)

简介: 那么本篇文章我们继续来和你聊聊并发工具类的第二篇文章 --- Semaphore 。


认识 Semaphore

Semaphore 是什么

Semaphore 一般译作 信号量,它也是一种线程同步工具,主要用于多个线程对共享资源进行并行操作的一种工具类。它代表了一种许可的概念,是否允许多线程对同一资源进行操作的许可,使用 Semaphore 可以控制并发访问资源的线程个数。

Semaphore 的使用场景

Semaphore 的使用场景主要用于流量控制,比如数据库连接,同时使用的数据库连接会有数量限制,数据库连接不能超过一定的数量,当连接到达了限制数量后,后面的线程只能排队等前面的线程释放数据库连接后才能获得数据库连接。

再比如交通公路上的红绿灯,绿灯亮起时只能让 100 辆车通过,红灯亮起不允许车辆通过。

再比如停车场的场景中,一个停车场有有限数量的车位,同时能够容纳多少台车,车位满了之后只有等里面的车离开停车场外面的车才可以进入。

Semaphore 使用

下面我们就来模拟一下停车场的业务场景:在进入停车场之前会有一个提示牌,上面显示着停车位还有多少,当车位为 0 时,不能进入停车场,当车位不为 0 时,才会允许车辆进入停车场。所以停车场有几个关键因素:停车场车位的总容量,当一辆车进入时,停车场车位的总容量 - 1,当一辆车离开时,总容量 + 1,停车场车位不足时,车辆只能在停车场外等待。

public class CarParking {
    private static Semaphore semaphore = new Semaphore(10);
    public static void main(String[] args){
        for(int i = 0;i< 100;i++){
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("欢迎 " + Thread.currentThread().getName() + " 来到停车场");
                    // 判断是否允许停车
                    if(semaphore.availablePermits() == 0) {
                        System.out.println("车位不足,请耐心等待");
                    }
                    try {
                        // 尝试获取
                        semaphore.acquire();
                        System.out.println(Thread.currentThread().getName() + " 进入停车场");
                        Thread.sleep(new Random().nextInt(10000));// 模拟车辆在停车场停留的时间
                        System.out.println(Thread.currentThread().getName() + " 驶出停车场");
                        semaphore.release();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }, i + "号车");
            thread.start();
        }
    }
}

在上面这段代码中,我们给出了 Semaphore 的初始容量,也就是只有 10 个车位,我们用这 10 个车位来控制 100 辆车的流量,所以结果和我们预想的很相似,即大部分车都在等待状态。但是同时仍允许一些车驶入停车场,驶入停车场的车辆,就会 semaphore.acquire 占用一个车位,驶出停车场时,就会 semaphore.release 让出一个车位,让后面的车再次驶入。

Semaphore 信号量的模型

上面代码虽然比较简单,但是却能让我们了解到一个信号量模型的五脏六腑。下面是一个信号量的模型:

微信图片_20220418200146.png

来解释一下 Semaphore ,Semaphore 有一个初始容量,这个初始容量就是 Semaphore 所能够允许的信号量。在调用 Semaphore 中的 acquire 方法后,Semaphore 的容量 -1,相对的在调用 release 方法后,Semaphore 的容量 + 1,在这个过程中,计数器一直在监控 Semaphore 数量的变化,等到流量超过 Semaphore 的容量后,多余的流量就会放入等待队列中进行排队等待。等到 Semaphore 的容量允许后,方可重新进入。

Semaphore 所控制的流量其实就是一个个的线程,因为并发工具最主要的研究对象就是线程。

它的工作流程如下

微信图片_20220418200150.png

这幅图应该很好理解吧,这里就不再过多解释啦。

Semaphore 深入理解

在了解 Semaphore 的基本使用和 Semaphore 的模型后,下面我们还是得从源码来和你聊一聊 Semaphore 的种种细节问题,因为我写文章最核心的东西就是想让我的读者 了解 xxx,看这一篇就够了,这是我写文章的追求,好了话不多说,源码走起来!

Semaphore 基本属性

Semaphore 中只有一个属性

private final Sync sync;

Sync 是 Semaphore 的同步实现,Semaphore 保证线程安全性的方式和 ReentrantLock 、CountDownLatch 类似,都是继承于 AQS 的实现。同样的,这个 Sync 也是继承于 AbstractQueuedSynchronizer 的一个变量,也就是说,聊 Semaphore 也绕不开 AQS,所以说 AQS 真的太重要了。

            </div>
目录
相关文章
|
人工智能 安全 算法
利用AI技术提升网络安全防御能力
【10月更文挑战第42天】随着人工智能技术的不断发展,其在网络安全领域的应用也日益广泛。本文将探讨如何利用AI技术提升网络安全防御能力,包括异常行为检测、恶意软件识别以及网络攻击预测等方面。通过实际案例和代码示例,我们将展示AI技术在网络安全防御中的潜力和优势。
|
6月前
|
人工智能 自然语言处理 数据挖掘
如何通过AI辅助数据分析
“数据驱动决策"已成为企业战略共识,越来越多的企业将数据分析列入核心投资。随着AI越来越成熟,使用AI辅助数据分析可以显著提升效率、深度和自动化水平。
896 7
|
8月前
|
算法 数据安全/隐私保护
基于SC-FDE单载波频域均衡的MPSK通信链路matlab仿真,包括帧同步,定时同步,载波同步,MMSE信道估计等
本内容展示了基于MATLAB 2022a的SC-FDE单载波频域均衡通信链路仿真,包括UW序列设计、QPSK调制、帧同步、定时与载波同步、SNR估计及MMSE信道估计等关键环节。通过8张仿真结果图验证了系统性能。理论部分详述了单载波频域均衡技术原理,以及各模块的设计与实现步骤。核心程序代码涵盖调制方式选择(如QPSK)、UW序列生成、数据帧构建、信道模拟及同步补偿等操作,为高效数据传输提供了完整解决方案。
200 19
|
8月前
|
监控 数据库连接 测试技术
《深入数据库连接池:解锁其核心作用与配置奥秘》
在数字化时代,数据库连接池作为数据库访问架构中的核心组件,通过资源重用、提升响应速度、优化资源分配和防止泄漏等方式,显著提高系统性能与稳定性。其关键在于合理选择连接池库(如HikariCP、Apache DBCP等),并科学配置参数(如初始连接数、最大/最小连接数、超时时间等)。结合性能测试与监控优化配置,可构建高性能、高可靠性的应用系统,满足业务需求。
184 5
|
数据采集 监控 并行计算
基于MCMC的贝叶斯营销组合模型评估方法论: 系统化诊断、校准及选择的理论框架
贝叶斯营销组合建模(Bayesian Marketing Mix Modeling,MMM)作为一种先进的营销效果评估方法,其核心在于通过贝叶斯框架对营销投资的影响进行量化分析。
332 3
基于MCMC的贝叶斯营销组合模型评估方法论: 系统化诊断、校准及选择的理论框架
|
Web App开发 前端开发 测试技术
构建响应式设计的七个最佳实践
本文介绍了构建响应式设计的七个最佳实践,包括使用流体布局、媒体查询、灵活的图片和媒体、响应式框架、可伸缩的字体、测试与优化及渐进增强和优雅降级,帮助开发者创建适应多设备的网站。
|
存储 监控 安全
邮件告警通知
【10月更文挑战第20天】
|
人工智能 Serverless API
云原生应用开发平台CAP评测
CAP(Cloud Application Platform)是阿里云提供的一站式应用开发及管理平台,集成了Serverless计算、AI应用模板、先进开发者工具和企业级应用管理功能。本文结合官方文档与实际操作,全面评测了CAP的产品优势、实际操作体验及性能表现,展示了其在降低成本、提高开发效率和灵活性方面的卓越能力。
|
编译器 Linux 开发者
.so文件反编译
【6月更文挑战第22天】.so文件反编译
933 56
|
JavaScript 数据可视化 开发者
echart:里面的属性
这段内容介绍了图表配置中的多个关键组件和属性,包括 `xAxis` 和 `yAxis` 的常见属性设置、`grid` 的布局调整、`dataZoom` 的数据缩放功能、`legend` 的图例配置以及颜色配置等。通过这些配置,可以实现图表的自定义显示,如坐标轴类型、数据源、最小值、最大值、刻度间隔、标签样式、线条样式等,同时还能调整图表在 DOM 元素中的大小和位置,以及实现数据的缩放和平滑交互效果。
391 0