Java中的信号量是什么以及如何使用它?

已发表: 2022-05-26

Sun Microsystems 于 1995 年为我们带来了 Java,它是一种协作的、依赖于类和对象的编程语言和计算机平台。 除非您安装了 Java,否则大量程序和网站将无法运行,并且每天都在开发更多。 Java 因其速度快、安全性和可靠性而受到市场欢迎并受到赞誉。 它是一种专门为在 Internet 的分散世界中使用而创建的计算机语言。 它牢记 C++ 编程语言的设计,但它更易于使用并强制执行面向对象的编程方法。

软件开发中执行 PG 程序可以教您在 Java 中脱颖而出所需的所有技能。

信号量示例:

Shared var mutex: semaphore = 1;

进程 i

开始

.

.

P(互斥体);

执行 CS;

V(互斥体);

.

.

结尾;

目录

是什么让 Java 脱颖而出?

一个由 Java 开发人员、架构师和爱好者组成的专门社区已经测试、完善、扩展和验证了 Java。 尽管 Java 已有近 20 年的历史,但多年来一直在稳步发展。

Java 旨在促进为各种计算机系统开发可移植的高性能程序,从而支持包含可访问性和跨平台交互的基本概念。 企业可以提供额外的服务,提高最终用户的工作效率、通信和协作,并通过使它们在异构环境中可用而大大降低企业和消费者应用程序的成本。

Java中的信号量是什么?

信号量使用计数器来规范对共享资源的访问。 如果计数器大于零,则允许访问。 如果值为 0,则拒绝访问。 计数器计数提供对共享资源的访问权限的许可。 因此,要访问资源,线程必须首先从信号量获得许可。

它是如何工作的?

通常,在使用信号量时,尝试访问共享资源的线程会尝试获得许可。 如果信号量计数大于零,则线程获得许可,导致信号量计数减少。 如果没有,线程将被暂停,直到获得许可。

当线程不再需要访问共享资源时,它会释放许可,导致信号量计数增加。 如果另一个线程正在等待许可,则该线程将在那一刻获得一个。

信号量的类型

Java中有四种类型的信号量。 它们如下:

二进制信号量

二进制信号量仅接受 0 和 1 作为值,用于创建互斥和同步并发活动。

二进制信号量示例:

公共类 BinarySemaphoreExample

{

私人布尔锁定=假;

二进制信号量(int 初始值)

{

锁定=(初始== 0);

}

公共同步 void waitForNotify() 抛出 InterruptedException

{

而(锁定)

{

等待();

}

锁定=真;

}

公共同步无效 notifyToWakeup()

{

如果(锁定)

{

通知();

}

锁定=假;

}

}

阅读我们与软件开发相关的热门文章

如何在 Java 中实现数据抽象? Java中的内部类是什么? Java 标识符:定义、语法和示例
通过示例了解 OOPS 中的封装 C 中的命令行参数解释 2022 年云计算的 10 大特点和特点
Java 中的多态性:概念、类型、特征和示例 Java 中的包以及如何使用它们? Git 初学者教程:从零开始学习 Git

计数信号量

在每一时刻,一个计数信号量的值代表了可以同时访问临界区的最大进程数。

计数信号量示例:

公共类 CountingSemaphoreExample

{

私人 int 信号 = 0;

公共同步 void take()

{

这个.信号++;

this.notify();

}

公共同步无效释放()抛出 InterruptedException

{

而(this.signal == 0)

等待();

this.signal-;

}

}

定时信号量:

定时信号量使线程能够运行一段设定的时间。 一段时间后,计时器重置并释放所有其他许可。

定时信号量示例:

类 TimedSemaphoresExample

{

私有 TimedSemaphore 信号量;

TimedSemaphoreExample(长周期,int slotLimit)

{

semaphore = new TimedSemaphore(period, TimeUnit.SECONDS, slotLimit);

}

布尔值 tryAdd()

{

返回信号量.tryAcquire();

}

int 可用插槽()

{

返回信号量.getAvailablePermits();

}

}

有界信号量

我们可以使用有界信号量设置上限。 它被用来代替计算信号量,因为它们没有上限值。 上限值表示可以存储的最大信号数。

有界信号量示例

公共类 BoundedSemaphoresExample

{

私人 int 信号 = 0;

私有int绑定= 0;

公共 BoundedSemaphoreexample(int upperBound)

{

this.bound = 上界;

}

公共无效同步take()抛出InterruptedException

{

而(this.signals == 绑定)

等待();

this.signals++;

this.notify++;

}

公共无效同步释放()抛出InterruptedException

{

而(this.signal == 0)

等待();

this.signals-;

}

}

探索我们流行的软件工程课程

SL。 不 软件开发计划
1 LJMU & IIITB 计算机科学硕士 加州理工学院 CTME 网络安全证书课程
2 全栈开发训练营 区块链中的 PG 程序
3 软件开发行政研究生课程 - DevOps 专业化 查看所有软件工程课程

特征:

信号量具有以下特点:

  • 它允许线程相互通信。
  • 它降低了同步度。 因此,它提供了一种低级同步方法。
  • 信号量中没有负值。 它的值可以大于或等于零。
  • 我们可以使用测试操作和中断来实现信号量,并使用文件描述符来执行它。

信号量的优缺点:

优点:

  1. 它使许多线程能够到达要害部分。
  2. 信号量与机器无关。
  3. 信号量在微内核的机器无关代码中实现。
  4. 不允许多个进程访问关键部分。
  5. 不会浪费处理时间或资源,因为信号量中总是有一个忙碌的等待。
  6. 它们是机器独立的,因此应该在微内核的机器独立代码中运行。
  7. 它们支持适应性强的资源管理。

缺点:

  1. 优先级反转是信号量最重要的限制之一。
  2. 操作系统必须跟踪所有等待和信号量调用。
  3. 它们的使用从未被强制要求,而只是根据传统。
  4. 必须正确执行等待和信号操作以避免信号量中的死锁。
  5. 因为信号量编程比较复杂,所以有可能无法实现互斥。
  6. 对于大规模应用程序来说,这也不是一个现实的策略,因为它会导致模块化的损失。
  7. 信号量更容易受到编程错误的影响。
  8. 编程错误可能导致死锁或违反互斥。

如何使用信号量作为锁?

信号量可以用作 Java 中的锁。 它表示它限制对资源的访问。 要获取锁,任何想要访问锁定资源的线程都必须首先调用acquire() 函数。 完成工作后,线程必须通过调用 release() 函数来释放锁。 请记住,上限应设置为 1。全栈开发中的执行 PG 课程将帮助您掌握所有这些技能。

概括

对 Java 等编程语言有清晰的认识对于软件开发人员的光明职业生涯至关重要。 upGrad提供了几门课程,这些课程可能会为您提供有前途的职业的正确选择。 普鲁德大学upGrad的全栈开发专业将教您在软件开发领域蓬勃发展所需的所有技能。

从世界顶级大学在线学习软件开发课程获得行政 PG 课程、高级证书课程或硕士课程,以加快您的职业生涯。

为什么我们需要 Java 中的信号量?

信号量是用于进程同步以管理并发进程的变量。 它还通过控制多个并发进程对共享资源的访问来防止竞争问题。

为什么我们需要计数信号量?

信号量通常用于协调资源访问,信号量计数设置为总资源列表。 当给定或添加资源时,线程原子地增加计数,当资源被撤回时,线程原子地减少计数。

为什么 Semaphore 被称为同步工具?

信号量本质上是一个被许多线程共享的整数变量。 在多处理环境中使用该变量来克服临界区问题并建立进程同步。 这有时被称为互斥锁。

什么是全栈开发?

全栈开发是创建 Web 应用程序的前端(客户端)和后端(服务器端)组件。 全栈 Web 开发人员可以创建成熟的在线应用程序和网站。 他们负责在线应用程序或网站的前端、后端、数据库和调试。