Java Semaphore2025年3月26日 | 阅读 9 分钟 在 Java 中,我们使用 **信号量** 来进行 线程 同步。它用于控制对共享资源的访问,该共享资源使用一个计数器变量。 Java 还提供了一个 **Semaphore 类**,其中包含构造函数和各种方法来控制对共享资源的访问。我们将在本节后面讨论它。 在继续本节之前,我们将首先了解 **什么是信号量、信号量的类型**、**它是如何工作的**,以及 **如何实现信号量**。在了解了所有这些之后,我们将继续讨论 **Java 信号量程序**。 什么是信号量?**信号量** 用于限制想要访问共享资源的线程数量。换句话说,它是一个非负变量,在线程之间共享,称为 **计数器**。它设置了线程的限制。信号量中的一个线程等待的机制可以被其他线程通知。
简而言之,计数器跟踪它已授予共享资源的权限数量。因此,信号量授予线程共享资源的权限。 信号量的特征信号量具有以下特征:
信号量的工作原理信号量通过一个计数器变量来控制对共享资源的访问。计数器是一个非负值。它的值可能大于 0 或等于 0。
让我们通过流程图来理解信号量的工作原理。 ![]() 信号量类型信号量有四种类型,如下所示:
![]() 让我们逐一详细讨论。 计数信号量**计数信号量** 用于解决多个进程同时想要在临界区执行的情况。因此,为了解决这个问题,我们使用计数信号量。例如,考虑以下代码片段。 让我们看看计数信号量的实现。 CountingSemaphoresExample.java 有界信号量我们可以使用 **有界信号量** 来设置上限。它用于代替计数信号量,因为计数信号量没有上限值。上限值表示 **它可以存储多少信号**。例如,考虑以下代码片段。 让我们看看有界信号量的实现。 BoundedSemaphoresExample.java 定时信号量**定时信号量** 允许线程运行指定的时间。在特定时间后,计时器将重置并释放所有其他权限。 让我们看看定时信号量的实现。 TimedSemaphoresExample.java 二进制信号量**二进制信号量** 与计数信号量相同。但请记住,它只接受二进制值,即 0 或 1。与其他信号量相比,它的实现更容易。如果值为 1,则信号操作成功,否则失败。 让我们看看二进制信号量的实现。 BinarySemaphoresExample.java Java 中的信号量在 Java 中,它是一个 **线程同步构造**。该构造使用一个称为 **计数器** 的变量来控制对共享资源的访问。它是一种用于管理并发进程并对其进行同步的变量类型。它也用于避免 **竞态条件**。它限制了访问共享资源的线程数量。 例如,我们可以限制一个文件同时最多有 10 个连接访问。 Java Semaphore 类Java 提供了一个 **Semaphore** 类来实现信号量机制。它属于 **java.util.concurrent** 包。它实现了 **Serializable** 接口。因此,不需要手动实现。 Semaphore 类提供了以下两个构造函数:
Semaphore(int permits)它创建一个 Semaphore 并将允许数(可用的初始允许数)作为参数解析。它指定了可以同时共享资源的线程数。permits 的值可能为负数。在这种情况下,在授予任何获取之前必须发生释放。 语法 Semaphore(int permits, boolean fair)它使用给定的允许数和给定的公平性设置创建一个 Semaphore。 语法 它解析两个参数:
Semaphore 类的常用方法该类提供了以下方法 **acquire() 方法:** 该方法从信号量获取允许,阻塞直到有可用允许,或者线程被中断。它将可用允许数减 1。 如果当前线程没有可用允许,则该线程将被禁用线程调度。当前线程进入非活动状态,直到发生以下两件事之一:
如果当前线程被中断,它会抛出 **InterruptedException**。该方法不返回任何值。 语法 **release() 方法:** 它释放一个允许并将其返回给信号量。它将可用允许数增加 1。如果一个线程尝试获取一个允许,信号量将授予该线程获取刚刚被其他线程释放的资源。此外,该线程将被考虑进行线程调度。 语法 **availablePermits() 方法:** 该方法返回信号量中可用于授予资源的允许数。通常,它用于调试和测试目的。 语法 让我们通过一个简单的例子来理解上述方法。 将信号量用作锁Java 允许我们将信号量用作锁。这意味着它会锁定对资源的访问。任何想要访问锁定资源的线程都必须在访问资源以获取锁之前调用 **acquire()** 方法。线程在任务完成后必须通过调用 **release()** 方法来释放锁。请记住将上限设置为 1。例如,考虑以下代码片段。 让我们看一个信号量并将其用作锁的例子。 SemaphoreAsLock.java 输出 ![]() 注意:当我们执行上面的程序时,每次都会得到不同的输出。所以,你的输出可能与上面显示的输出不同。Java 信号量示例让我们通过一个 Java 程序来理解信号量机制。在下面的示例中,我们创建了一个带有初始允许值为 3 的 Semaphore 类构造函数。 SemaphoreExample.java 输出 ![]() 下一话题Java 多线程中的忙等待 |
类和对象是Java编程语言的基础,因为它是一种面向对象的语言。当我们只需要在一个程序中存储一个对象时,我们使用了Object类型的变量。然而,使用项目数组更好……
阅读 3 分钟
这是原始数据类型。它用于声明字符类型的变量和方法。它能够存储无符号的 16 位 Unicode 字符。要点:char 的范围在 0 到 65,535(含)之间。它的默认值为“\u0000”。它的默认大小为 2...
阅读 2 分钟
与外观、适配器和装饰器模式一样,享元设计模式是结构模式。当生成大量类对象时,将应用享元设计模式。通过共享对象,享元设计模式有助于减轻内存压力,这对于嵌入式系统等内存较低的设备很重要...
阅读 10 分钟
是在 Java 控制台中显示的错误消息,当 Java 程序中出现错误时显示。它类似于 Windows 错误消息,但特定于 Java 程序。此错误消息可以提供有关问题的关键信息,例如错误...
阅读 4 分钟
Diffie-Hellman 算法是用于建立共享密钥的最重要算法之一。在公共网络上交换数据时,我们可以使用共享密钥进行秘密通信。我们使用椭圆曲线来生成点并获得一个秘密...
阅读 4 分钟
ZIP 是一种常见的文件格式,可将一个或多个文件压缩到一个位置。它减小了文件大小,并使其更易于传输或存储。接收者可以在传输后解压缩(或提取)ZIP 文件并使用文件...
阅读 8 分钟
List 和 ArrayList 之间的区别 Java 集合提供了处理对象组的架构。集合表示对象的单个单元。它允许我们将对象组作为一个单元进行存储和操作。我们可以轻松地执行许多操作,例如...
5 分钟阅读
Java 社区流程 (JCP) 是开发和演进 Java 编程语言及其相关技术的关键机制。自 1998 年成立以来,JCP 在保持 Java 在快速发展的软件开发世界中的相关性和适应性方面发挥了至关重要的作用。在……
阅读 6 分钟
巴斯塔尔是印度恰蒂斯加尔邦一个风景如画的地区,而爪哇是印度尼西亚一个重要的岛屿,乍一看可能相去甚远。一个坐落在茂密森林和原住民部落之间的文化天堂,另一个是东南亚一个繁华的技术中心...
阅读 4 分钟
在 Java 中,逻辑运算符用于对布尔表达式执行逻辑运算。它们通常会评估表达式的两侧。Java 中有三种逻辑运算符:逻辑与 (&&) 逻辑或 (||) 逻辑非 (!) 运算符 运算符名称 示例 说明 && 逻辑与 a&&b 两个条件必须为真才能得到结果...
7 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India