Semaphore简介

semaphore英文翻译为信号标,它是能控制允许多少线程去访问资源,也可以反馈线程在指定时间是否获得可执行权的信号,从而对这些超时未获取权力的线程做另行安排。

Semaphore使用场景

从简介中可以得知,semaphore可以限制并发访问数量,即为限流,像是微服务组件hystrix、sentinel等限流中间件都可使用此原理,当然随之而来,那些被限制通行的线程是被丢弃?还是去执行另外的流程,就是“降级服务”。

Semaphore使用demo

1、定义线程任务+降级服务

@Slf4j
public class DegradeTask extends Thread{Semaphore semaphore;public DegradeTask(Semaphore semaphore,String tname){super(tname);this.semaphore=semaphore;}public void run(){try {//tryAcquire尝试在500毫秒内获取执行权,并返回true/false反馈是否成功boolean b = semaphore.tryAcquire(500, TimeUnit.MILLISECONDS);//获取成功if(b){//执行任务log.info("{}线程在{}时间执行任务",Thread.currentThread().getName(),System.currentTimeMillis());Thread.sleep(200);//执行完任务需要释放权利,以供其他线程拿到执行权semaphore.release();//获取失败}else{//执行降级任务degrade();}}catch (Exception e){e.printStackTrace();}}/*** 定义降级任务*/private void degrade(){log.info("降级服务");}}

2、模拟线程并发测试结果

public class TestMyTask {public static void main(String[] args) {//初始值为几?(就是限制几个线程同时执行,并行)Semaphore semaphore = new Semaphore(3);//模拟20个线程去抢执行权for (int i = 0; i < 20; i++) {new Thread(new DegradeTask(semaphore,"线程"+i)).start();}}
}

测试结果

[Thread-2] INFO testSemaphore.DegradeTask - Thread-2线程在1625380595501时间执行任务
[Thread-1] INFO testSemaphore.DegradeTask - Thread-1线程在1625380595501时间执行任务
[Thread-0] INFO testSemaphore.DegradeTask - Thread-0线程在1625380595501时间执行任务
[Thread-4] INFO testSemaphore.DegradeTask - Thread-4线程在1625380595709时间执行任务
[Thread-5] INFO testSemaphore.DegradeTask - Thread-5线程在1625380595709时间执行任务
[Thread-3] INFO testSemaphore.DegradeTask - Thread-3线程在1625380595709时间执行任务
[Thread-6] INFO testSemaphore.DegradeTask - Thread-6线程在1625380595910时间执行任务
[Thread-8] INFO testSemaphore.DegradeTask - Thread-8线程在1625380595910时间执行任务
[Thread-7] INFO testSemaphore.DegradeTask - Thread-7线程在1625380595910时间执行任务
[Thread-9] INFO testSemaphore.DegradeTask - 降级服务
[Thread-10] INFO testSemaphore.DegradeTask - 降级服务
[Thread-17] INFO testSemaphore.DegradeTask - 降级服务
[Thread-13] INFO testSemaphore.DegradeTask - 降级服务
[Thread-18] INFO testSemaphore.DegradeTask - 降级服务
[Thread-16] INFO testSemaphore.DegradeTask - 降级服务
[Thread-15] INFO testSemaphore.DegradeTask - 降级服务
[Thread-14] INFO testSemaphore.DegradeTask - 降级服务
[Thread-12] INFO testSemaphore.DegradeTask - 降级服务
[Thread-11] INFO testSemaphore.DegradeTask - 降级服务
[Thread-19] INFO testSemaphore.DegradeTask - 降级服务

semaphore源码解析

  • 每个线程必须从semaphore获得一个许可,当线程执行完后,许可将被返回到池中,并向semaphore返回一个许可,允许另一个线程获得该许可。
  • 请注意,在调用semaphore的acquire时不会持有同步锁,因为这将阻止将许可返回到池中。semaphore封装了限制对池的访问所需的同步,与维护池本身一致性所需的任何同步是分开的。
  • 一个初始化为1的semaphore,它最多只有一个可用的许可,就可以作为一个互斥锁。这通常被称为二进制信号量,因为它只有两种状态:一种允许可用,或者不允许。当以这种方式使用时,二进制信号量具有一个属性(不像许多java.util.concurrent.lock Lock实现),即“锁”可以由除所有者以外的线程释放(因为信号量没有所有权的概念)。这在某些特定的上下文中可能很有用,比如死锁恢复。
  • 这个类的构造函数可选地接受公平性参数。
    • 当设置为false时,该类不保证线程获取许可的顺序。特别地,是允许阻塞的,也就是说,一个调用acquire的线程可以在一个正在等待的线程之前被分配一个许可证——逻辑上,新线程将自己放在等待线程队列的头部。
    • 当公平性设置为true时,信号量保证调用任何获取方法的线程会被选择,以其调用这些方法的顺序获得许可(先入先出;先进先出)。请注意,FIFO顺序必然适用于这些方法中特定的内部执行点。因此,一个线程可能在另一个线程之前调用acquire,但在另一个线程之后到达排序点,从方法返回时也是如此。还要注意,非定时的tryAcquire方法不遵守公平性设置,但会接受任何可用的许可。
    • 通常,用于控制资源访问的信号量应该初始化为公平的,以确保没有线程因为访问资源而耗尽。当将信号量用于其他类型的同步控制时,非公平排序的吞吐量优势往往超过公平性考虑。
  • 该类还提供了方便的方法来一次获取和释放多个许可。当这些方法在不确定公平的情况下使用时,要注意增加的无限期推迟的风险。
    static final class FairSync extends Sync {private static final long serialVersionUID = 2014338818796000944L;FairSync(int permits) {super(permits);}protected int tryAcquireShared(int acquires) {for (;;) {if (hasQueuedPredecessors())return -1;//*********state控制许可数量从而控制线程执行数量***开始***//int available = getState();int remaining = available - acquires;if (remaining < 0 ||compareAndSetState(available, remaining))return remaining;//*********state控制许可数量从而控制线程执行数量***结束***//}}}

Semaphore是什么?相关推荐

  1. Java并发编程之CountDownLatch、CyclicBarrier和Semaphore

    前言 本文为对CountDownLatch.CyclicBarrier.Semaphore的整理使用 CountDownLatch CountDownLatch类位于java.util.concurr ...

  2. java 多线程 信号_Java多线程——Semaphore信号灯

    Semaphore [ˈseməfɔːr]可以维护当前访问自身的线程个数,并提供了同步机制.使用Semaphore可以控制同时访问资源的线程个数(即允许n个任务同时访问这个资源),例如,实现一个文件允 ...

  3. linux内核 semaphore,2.4内核里semaphore源码的一个疑问

    博主你好, 请教一个问题. __down()里面有一段代码,  我觉得不那么保险.我先把__down的源码贴出来: ========================================== ...

  4. JAVA中的并发工具 -- CountDownLatch、CyclicBarrier、Semaphore

    2019独角兽企业重金招聘Python工程师标准>>> CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成操作. CountDownLatc ...

  5. 信号量Semaphore一篇文章叫你明白

    已经习惯了阿里面试官的冷笑:用过Semaphore吧,不妨说说? 本质就是 信号量模型,模型图如下: 其中的 计数器 和 等待队列 对外部是透明的,仅能通过提供的三大方法访问它们. 详细说说哪三大方法 ...

  6. 别再和面试官说不懂信号量Semaphore了!

    已经习惯了阿里面试官的冷笑:用过Semaphore吧,不妨说说? 本质就是 信号量模型,模型图如下: 其中的 计数器 和 等待队列 对外部是透明的,仅能通过提供的三大方法访问它们. 详细说说哪三大方法 ...

  7. 15.并发工具类(解析hashtable,ConcurrentHashMap1.7与1.8的区别以及Semaphore)

    3. 并发工具类 3.1 并发工具类-Hashtable Hashtable出现的原因:在集合类中HashMap是比较常用的集合对象,但是HashMap在多线程环境下可能会出现线程不安全的情况,为了保 ...

  8. LeetCode 1115. Print FooBar Alternately--多线程并发问题--Java解法--CyclicBarrier, synchronized, Semaphore 信号量

    此文首发于我的个人博客:zhang0peter的个人博客 LeetCode题解专栏:LeetCode题解 LeetCode 所有题目总结:LeetCode 所有题目总结 题目地址:Print FooB ...

  9. Semaphore(信号量)

    Semaphore是什么 Semaphore通常我们叫它信号量,可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源. 使用场景 通常用于哪些资源有明确访问数量限制的场景,常 ...

  10. Redisson 分布式锁源码 11:Semaphore 和 CountDownLatch

    前言 Redisson 除了提供了分布式锁之外,还额外提供了同步组件,Semaphore 和 CountDownLatch. Semaphore 意思就是在分布式场景下,只有 3 个凭证,也就意味着同 ...

最新文章

  1. DevicePass-through及网卡的直接分配在Xen里面的实现
  2. 47.内存连续分配管理方式有哪几种?
  3. git通过authorized_keys来管理用户的权限(二)
  4. 创业公司产品经理如何画好原型图
  5. 2014年 第5届 蓝桥杯 Java B组 省赛解析及总结
  6. Ubuntu 10.10 下配置Telnet服务器
  7. linux环境对xml的影响,Linux下XPath对xml解析
  8. 吉士丁与新潮传媒达成亿级战略合作,打造国产奶酪新势力
  9. 加版S3(I747M)的4.4.2版本,可root
  10. mac mysql not found_mac版mysql安装后显示mysql: command not found咋整?
  11. ajax将数据显示在class为content的标签中_python爬取微博评论(无重复数据)
  12. python用什么软件编程-python开发用什么编辑器
  13. subclipse同步冲突问题A conflict in the working copy obstructs the current operation
  14. 计算机电路基础实验一仪器使用,计算机电路基础(1)实验.pdf
  15. 非结构化数据解决方案:优化、优化、优化
  16. Ubuntu(21.04)下UHD(4.1)与Gnuradio安装配置--USRP X410软件无线电平台开发
  17. 利用Scrapy编写“1024网站种子吞噬爬虫”,送福利
  18. ps如何把自己的图与样机结合_如何利用PS制作贴图样机那
  19. PMP考试的分数线是怎么确定的(记分规则,成绩的演变)
  20. 工程数学 计算方法 第五章 数值积分

热门文章

  1. Vue安装uuid插件
  2. 字节跳动 2022.3.20后端开发笔试 解答
  3. 雷蛇灵刃笔记本u盘安装win10详细教程
  4. Android包体积过大,真的会影响绩效
  5. 《青春斗》:注定痛并快乐着的青春
  6. 企业站小白如何选择适合自己的云服务器配置?
  7. 一文读懂数仓建设和数据治理
  8. Exadata X2-2 更换 存储节点Flash卡电池(ESM)
  9. 百科笔记:自主知识产权
  10. Mybatis分页插件介绍