Semaphore (信号量)是由计算机科学家Dijkstra在1965年提出的,广泛应用不同的操作系统,在管程提出之前信号量就是并发编程领域的霸主!几乎所有并发的语言都支持信号量机制。

Semaphore 也有被翻译成信号灯,因为其机制就像我们日常生活中的红绿灯,车辆的通行看红绿灯,对应编程世界的线程能不能执行得看信号灯!

Semaphore 用来多线程互斥问题,相对于synchronized和Lock来说它允许多个线程访问一个临界区!例如各种池:数据库连接池、对象池等,这些池的需求就是同一时刻允许多个线程同时使用连接池。

Semaphore的模型可以概括为一个计数器、一个等待队列、三个方法。三个方法原子性分别是init()、down()、up();init():设置计数器的初始值。down():将计数器的值减一,如果减了一之后,计数器的值小于0,则当前的线程被阻塞,否则继续执行。up():将计数器的值加一,如果加了一之后,计数器的值小于等于0,则唤醒等待队列中的一个线程,并且将它移除出等待队列。(注意是小于等于0,不应该理解为大于等于0,因为大于等于0表明此时没有等待的线程,所以不会有唤醒这个操作。)

简单的理解就是Semaphore就是通过这三个方法来改变计数器,通过计数器的值来判断此时的线程是应该加入到等待队列中等待还是成功执行。

信号量模型也被称为PV原语,也就是down和up操作最早称为P操作和V操作,有些人还称为semWait和semSignal。

在JAVA中信号量模型是由 java.util.concurrent.Semaphore 的实现,并且down和up对应的实现方法是acquire和release,我们来看下简单的使用例子

如果你想多让几个线程进去临界区,那么就把Semaphore构造器中的1改为你想要的线程数。

可以理解为颁发许可证,比如想同时允许3个线程进入临界区,构造器中的数就填3,理解为搞了3张许可证,然后颁发出去,谁拿到了许可证谁就能进临界区,进入临界区后的线程搞完事了,就归还许可证,然后出去。

Semaphore的内部共存在Sync、NonfairSync、FairSync三个类。

NonfairSync与FairSync类继承自Sync类,Sync类继承自AbstractQueuedSynchronizer抽象类,也就Semaphore是依托于NonfairSync、FairSync来实现的。

可以通过构造函数来指定为公平锁还是非公平锁,公平的意思这个许可只会给按先来后到的顺序给等待队列中的线程。

而非公平的意思就是对于任何申请许可的线程,都第一时间看是否有多余的许可,如果有则给此线程。

差别就在于有没hasQueuedPredecessors(),这个方法就是判断当前线程是否是等待队列中的头结点,如果不是,则不给于分配。

大致Semaphore的模型和模型实现思路就是这样,建议多看看源码,不难的可以加深理解,并且懂得具体实现之后能掌握把控更多细节,还不怕面试官问。

如有错误欢迎指正!个人公众号:yes的练级攻略

java semaphore(0)_面试官:说说Java中的信号量?Semaphore相关推荐

  1. java类加载过程_面试官:java类的加载过程

    Java 类加载机制 类从被加载到JVM中开始,到卸载为止,整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段. 其中类加载过程包括加载.验证.准备.解析和初始化五个阶段. 类的加载 ...

  2. java 委托_面试官:java双亲委派机制及作用

    什么是双亲委派机制 当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类. 类加载器的类别 Bootst ...

  3. java录排名怎么写_面试官:Java排名靠前的工具类你都用过哪些?

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 推荐:https://www.xttblog.com/?p=5158 在Java ...

  4. java线程泄露_面试官:小伙子先来说一下可能引起Java内存泄露的场景吧

    原标题:面试官:小伙子先来说一下可能引起Java内存泄露的场景吧 本文分析一下可能引起java内存泄露的场景: 通过 finalize 方法 终结器finalizers的使用是潜在内存泄漏问题的另一个 ...

  5. java 线程状态_面试官问:为什么Java线程没有Running状态?我懵了

    点击上方"占小狼的博客",选择"设为星标" 本文阅读时间大约4分钟. 来源:https://dwz.cn/dLRLBZab Java虚拟机层面所暴露给我们的状态 ...

  6. java项目不要用反射_面试官:Java 反射是什么?我回答不上来!

    一.概念 反射就是把Java的各种成分映射成相应的Java类. Class类的构造方法是private,由JVM创建. 反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检 ...

  7. mybatis的简单查询用语句吗_面试官:Mybatis中的TypeHandler你用过吗?

    前言 相信大家用Mybatis这个框架至少一年以上了吧,有没有思考过这样一个问题:数据库有自己的数据类型,Java有自己的数据类型,那么Mybatis是如何把数据库中的类型和Java的数据类型对应的呢 ...

  8. java分页查询_面试官:数据量很大,分页查询很慢,有什么优化方案?

    准备工作 一般分页查询 使用子查询优化 使用 id 限定优化 使用临时表优化 关于数据表的id说明 <Java 2019 超神之路> <Dubbo 实现原理与源码解析 -- 精品合集 ...

  9. java中double类型占几个字节_面试官:Java 中有几种基本数据类型是什么?各自占用多少字节?...

    认识基本数据类型 在学习基本数据类型之前,我们先认识一下这两个单词:1.bit --位:位是计算机中存储数据的最小单位,指二进制数中的一个位数,其值为"0"或"1&quo ...

最新文章

  1. 客快物流大数据项目(六十二):主题及指标开发
  2. 主成分分析(PCA)Python代码实现
  3. ArcFace - 人脸识别
  4. 2021级山西高考成绩查询时间,2021山西高考成绩什么时候出
  5. java菱形有几种状态_java程序,打出一个菱形,有什么规律吗
  6. 通过JavaScript简单的操作DOM(一)
  7. Mastercam X9中文版
  8. 为什么EXE不能超过4GB
  9. eth显卡算力2020最新排行_最新三大主流币IPFS比特币ETH挖矿全网算力动态速递单周报(12.3更新)...
  10. 【C++深度剖析教程39】实现C++数组类模板
  11. Linux技术学习要点,您掌握了吗---初学者必看
  12. hadoop 集群间数据迁移
  13. c++ 输出二进制_C语言 printf 格式化输出的详细示例
  14. 【操作系统】对换、分页和分段方式-思维导图
  15. 一些有价值的工作建议
  16. 2021考研王道计算机408
  17. 【WPF】使用SVG资源
  18. ICCV2019 | 锁定视频中的目标:港大提出运动注意力检测方法
  19. 【smoj 1167】松果
  20. 正三角形旋转一周得到的图形是_将图中的直角三角形绕最长的边旋转一周可以得到的一个几何体,从正面看这个几何体所得到的平面图形是()A.B...

热门文章

  1. Spring 框架基础(03):核心思想 IOC 编程说明,案例演示
  2. Densely CNN
  3. MATLAB2017深度学习工具箱总结
  4. Linux多线程实践(4) --线程特定数据
  5. 数据结构基础(1) --Swap Bubble-Sort Select-Sort
  6. 十二. python面向对象主动调用其他类
  7. Gitter - 高颜值GitHub小程序客户端诞生记
  8. Spring boot学习整理
  9. supervisord进程管理
  10. 从零开始学_JavaScript_系列(四)——jquery(基础,选择器,触发条件,动画,回调函数)...