Java 标准库 API 系列之 Semaphore

本贴最后更新于 692 天前,其中的信息可能已经时移世异

Semaphore 是一种经典的同步工具,用于控制并发线程数,它可以保证在同一时间内只有一定数量的线程能够访问某个资源,从而避免线程间的竞争和冲突。

Semaphore 有两个核心概念:

  1. 许可证(Permit):表示可用的访问权限数量,Semaphore 内部维护了一个许可证池,初始时可以设置许可证的数量。
  2. 信号量(Semaphore):表示一个计数器,当线程想要访问某个资源时,必须先从 Semaphore 中获取一个许可证,然后才能访问资源;当线程使用完资源后,必须释放许可证,以便其他线程可以访问资源。

Semaphore 的使用方式如下:

  1. 创建 Semaphore 对象,指定许可证数量。
  2. 在需要访问共享资源的线程中,调用 acquire() 方法获取许可证。
  3. 线程使用共享资源。
  4. 在共享资源使用完毕后,调用 release() 方法释放许可证。

听起来有点像操作系统里面信号量的概念,其实本质是一样的,不过操作系统层面的信号量是作用于进程与进程之间的同步,java 里面的信号量是线程与线程之间的同步。

下面是一个简单的示例代码,使用 Semaphore 控制了同时执行的线程数目:

import java.util.concurrent.Semaphore; public class SemaphoreExample { public static void main(String[] args) throws InterruptedException { Semaphore semaphore = new Semaphore(3); // 许可证数量为3 // 创建10个线程 for (int i = 0; i < 10; i++) { new Thread(() -> { try { semaphore.acquire(); // 获取许可证 System.out.println(Thread.currentThread().getName() + " acquire semaphore"); Thread.sleep(2000); // 模拟使用共享资源的时间 semaphore.release(); // 释放许可证 System.out.println(Thread.currentThread().getName() + " release semaphore"); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } } }

在上面的示例中,创建了 10 个线程,但是许可证数量只有 3 个,因此同时最多只能有 3 个线程获取许可证,其他线程需要等待。每个线程获取到许可证后,会打印一条日志,表示成功获取许可证,然后等待 2 秒,模拟使用共享资源的时间,使用完资源后,会打印一条日志,表示成功释放许可证。

总之,Semaphore 是一种非常常用的同步工具,可以用于控制并发线程数,防止线程间的竞争和冲突,它的使用方式简单明了,非常适合于多线程编程。

它和锁的区别呢

Semaphore 和锁(比如 ReentrantLock)的区别在于,锁通常只允许一个线程同时访问共享资源,而 Semaphore 可以控制同时访问共享资源的线程数量,即可以允许多个线程同时访问。

另外,Semaphore 的许可证数量是可以动态调整的,而锁的访问数量是固定的。Semaphore 可以用于实现资源池等场景,而锁则更适用于互斥访问共享资源的场景。

使用场景

Semaphore 的主要应用场景是控制并发访问某些共享资源的线程数量,通常用于限流和保护资源。

例如,假设有一个公共资源,比如数据库连接池、线程池等,由于该资源的数量是有限的,为了防止过多的线程同时访问该资源导致资源竞争和性能下降,可以使用 Semaphore 来控制并发线程的数量。另外,Semaphore 也可以用于限制并发请求的数量,避免服务器过载。

另外,Semaphore 还可以用于实现生产者-消费者模型,其中生产者和消费者之间需要进行同步和协作,以避免出现数据竞争或者生产者和消费者之间的阻塞情况。Semaphore 可以用来控制生产者和消费者的访问数量,以保证生产者和消费者之间的同步和协作。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3197 引用 • 8215 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 35 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 3 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    298 引用 • 763 回帖 • 1 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 441 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 1 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 9 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 5 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    693 引用 • 537 回帖
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    151 引用 • 257 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 6 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 391 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖 • 1 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 296 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 1 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 110 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 693 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 160 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖 • 4 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 492 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 57 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 648 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    180 引用 • 408 回帖 • 490 关注
  • 倾城之链
    23 引用 • 66 回帖 • 166 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 2 关注