我的编程空间,编程开发者的网络收藏夹
学习永远不晚

什么是信号量Semaphore

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

什么是信号量Semaphore

这篇文章将为大家详细讲解有关什么是信号量Semaphore,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

什么是信号量Semaphore

本质就是 信号量模型,模型图如下:

其中的 计数器 和 等待队列 对外部是透明的,仅能通过提供的三大方法访问它们。

什么是信号量Semaphore

详细说说哪三大方法?

  • init()

用于设置计数器的初始值。

  • down()

计数器-1。若此时计数器<0,则当前线程被 阻塞。

  • up()

计数器+1。若此时计数器&le;0,则唤醒 等待队列  中的一个线程,并将其从【等待队列】移除。有同学可能会认为这里的判断条件应该&ge;0,估计你是理解成生产者-消费者模式中的生产者了。可以反过来想,>0  意味着没有阻塞的线程,所以只有 &le;0 时才需要唤醒一个等待的线程。

down()、up()应配对使用,并按序使用:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 先调用down(),获取锁

  3. 执行处理完后,调用up(),释放锁

若信号量init值为1,并发场景下应该不会出现>0情况,除非故意调先用up(),但这也失去了信号量的意义。

注意,这些方法都是原子性的,由信号量模型的实现方保证。JDK里的信号量模型就是由Semaphore实现,Semaphore保证了这三个方法都是原子操作。

talk is cheap,show me code?

什么是信号量Semaphore

信号量模型中的down()、up()最早被称为P操作和V操作,信号量模型也称PV原语。还有的人会用semWait()和semSignal()表达它们,叫法不同,语义都相同。JUC的acquire()、release()分别对应down()和up()。

如何使用信号量?

就像信号灯,必须先检查是否为绿灯才能通过。比如累加器,count+=1操作是个临界区,只允许一个线程执行,也就是说要保证互斥。

什么是信号量Semaphore

假设线程t1、t2同时访问add(),当同时调用acquire时,由于acquire是个原子操作,仅会有一个线程(假设t1)把信号量里的计数器减为0,t2则是将计数器减为-1:

  • 对t1,信号量里面的计数器的值是0,&ge;0,所以t1不会被阻塞,而是继续执行

  • 对t2,信号量里面的计数器的值是-1,<0,所以t2被阻塞

所以此时只有t1会进入临界区执行count+=1。

当t1执行release(),信号量里计数器的值是-1,加1之后的值是0,&le;0,根据up(),此时等待队列中的t2会被唤醒。于是t2在t1执行完临界区代码后,才获得进入临界区执行的机会,这就保证了互斥。

既然有JDK提供了Lock,为啥还要提供一个Semaphore ?

实现互斥锁,仅是 Semaphore的部分功能,Semaphore还可以允许多个线程访问一个临界区。

最常见的就是各种池化资源,比如数据库连接池,同一时刻,允许多个线程同时使用连接池。每个连接在被释放前,不允许其他线程使用。

对象池要求一次性创建出N个对象,之后所有的线程重复利用这N个对象,当然对象在被释放前,也是不允许其他线程使用的。所以核心就是限流器,这里的限流指不允许多于N个线程同时进入临界区。

如何快速实现一个这样的限流器呢?

那就是信号量。把计数器的值设置成对象池里对象的个数N即可:

什么是信号量Semaphore

注意这里使用的是 Vector,进入临界区的N个线程不安全。add/remove都是不安全的。比如 ArrayList remove() :

什么是信号量Semaphore

关于什么是信号量Semaphore就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

什么是信号量Semaphore

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JavaAQS信号量Semaphore的使用

Semaphore来自于JDK1.5的JUC包,直译过来就是信号量,被作为一种多线程并发控制工具来使用。本文将详解其原理与使用方法,感兴趣的可以学习一下
2023-02-02

一文读懂go中semaphore(信号量)源码

目录运行时信号量机制 semaphore前言作用是什么几个主要的方法如何实现acquireSudogreleaseSudogsemaphorepoll_runtime_Semacquire/sync_runtime_SemacquireMu
2022-06-07

怎么看待Linux 多线程中的信号量Semaphore

今天就跟大家聊聊有关怎么看待Linux 多线程中的信号量Semaphore,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。理解 Semaphore,从一个好的翻译开始Semaphore
2023-06-15

AQS同步组件Semaphore信号量案例剖析

这篇文章主要为大家介绍了AQS同步组件Semaphore信号量案例剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

Java并发编程之Semaphore(信号量)详解及实例

Java并发编程之Semaphore(信号量)详解及实例概述通常情况下,可能有多个线程同时访问数目很少的资源,如客户端建立了若干个线程同时访问同一数据库,这势必会造成服务端资源被耗尽的地步,那么怎样能够有效的来控制不可预知的接入量呢?及在同
2023-05-31

Linux中的semaphore是什么

这篇文章给大家分享的是有关Linux中的semaphore是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Semaphore 通常我们叫它信号量, 可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以
2023-06-28

Java并发编程中Semaphore计数信号量的示例分析

这篇文章主要为大家展示了“Java并发编程中Semaphore计数信号量的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java并发编程中Semaphore计数信号量的示例分析”这篇文章
2023-05-31

windows中信号量和互斥量的区别是什么

本篇内容介绍了“windows中信号量和互斥量的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!区别:1、互斥量用于线程的互斥,信号
2023-06-25

Linux信号机制是什么

Linux信号机制是一种用于进程间通信的机制,用于在进程之间传递异步事件的通知。当某个进程接收到一个信号时,它可以选择忽略、捕获或默认处理该信号。信号可以由操作系统、其他进程或进程自身发送。常见的信号包括SIGINT(键盘中断信号)、SIG
2023-08-12

win11活动信号模式是什么

今天小编给大家分享一下win11活动信号模式是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。答:win11的活动信号模式
2023-07-02

怎么理解python信号量

本篇内容介绍了“怎么理解python信号量”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!01:信号量1)概述:信号量是用来控制线程并发数的。
2023-06-01

Linux信号列表的作用是什么

本篇内容主要讲解“Linux信号列表的作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux信号列表的作用是什么”吧!我们运行如下命令,可看到Linux支持的信号列表:~$ kill
2023-06-13

linux捕获信号的方法是什么

在Linux中,捕获信号的方法有两种:1. 使用信号处理函数:可以通过使用signal()函数来注册信号处理函数,该函数的原型如下:```cvoid (*signal(int sig, void (*handler)(int)))(int)
2023-08-12

swoole中信号量怎么使用

这篇文章主要介绍了swoole中信号量怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇swoole中信号量怎么使用文章都会有所收获,下面我们一起来看看吧。在swoole中,信号量主要用来保护共享资源,使得
2023-06-29

为什么wifi有信号但是连不上

wifi有信号但是连不上是由于密码错误、路由器问题、设备问题、信号干扰或IP地址冲突等原因造成的。详细介绍:1、密码错误,检查密码是否正确,并确保我们输入的是最新的密码;2、路由器问题,尝试重启路由器,或者联系网络服务提供商寻求帮助;3、设
2023-08-18

linux自定义信号的方法是什么

在Linux中,可以使用以下方法来自定义信号:1. 使用`signal()`函数:可以使用`signal()`函数来设置信号处理程序。该函数的原型如下:```cvoid (*signal(int signum, void (*handler
2023-08-12

qt中信号和槽的作用是什么

在Qt中,信号和槽是一种用于对象之间通信的机制。信号和槽允许对象在特定事件发生时发送信号,其他对象可以连接到这些信号并在接收到信号时执行特定的槽函数。信号和槽的作用包括:1. 用于对象之间的通信:通过信号和槽机制,一个对象可以向其他对象发送
2023-09-27

编程热搜

目录