1、Semaphore概念

Semaphore是Java1.5之后提供的一种同步工具,Semaphore可以维护访问自身线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而release() 释放一个许可。

Semaphore实现的功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中 的任何一个人让开后,其中等待的另外5个人中又有一个人可以去占用了。另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的参数选项。单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合,所以单个信号量的Semaphore对象的功能就和synchronized实现互斥是共同的

2、功能扩展

1、Semaphore往往结合线程池使用,比如建立一个固定大小为10的线程池,最多线程并发数为10个,当你提交20个任务到线程池的时候,线程池会安排这10个线程优先接待20个任务中的10个,当优先安排的10个中有完成的会去接待剩下的10个任务中的某一个任务,直到执行完所有任务为止。但是如果此时引入了Semaphore对象,所传的值是5的时候,那么这线程池中10个线程只有5个能够并发执行,此时就做到了限量访问的作用。
 
2、当Semaphore构造方法中传入的参数是1的时候,此时线程并发数最多是1个,即是线程安全的,这种方式也可以做到现场互斥。Java实现互斥线程同步有三种方式synchronized、lock 、单Semaphore

3、Semaphore的使用demo如下

  1.  
    public class SemahoreDemo {
  2.  
     
  3.  
    public static void main(String[] args) {
  4.  
    ExecutorService executorService = Executors.newCachedThreadPool();
  5.  
     
  6.  
    final Semaphore semaphore = new Semaphore(1,true);
  7.  
     
  8.  
    for(int i=0;i<10;i++){
  9.  
    Runnable runnable = new Runnable() {
  10.  
    @Override
  11.  
    public void run() {
  12.  
    try {
  13.  
    semaphore.acquire();
  14.  
    } catch (InterruptedException e) {
  15.  
    e.printStackTrace();
  16.  
    }
  17.  
     
  18.  
    System.err.println("线程"+Thread.currentThread().getName()+"进入,已有"+(3-semaphore.availablePermits())+"并发");
  19.  
     
  20.  
    try {
  21.  
    Thread.sleep((long)(Math.random()*1000));
  22.  
    } catch (InterruptedException e) {
  23.  
    e.printStackTrace();
  24.  
    }
  25.  
     
  26.  
    System.out.println("线程"+Thread.currentThread().getName()+"即将离开");
  27.  
     
  28.  
    semaphore.release();
  29.  
     
  30.  
    System.err.println("线程"+Thread.currentThread().getName()+"已经离开"+"当前并发数:"+(3-semaphore.availablePermits()));
  31.  
    }
  32.  
    };
  33.  
     
  34.  
    executorService.execute(runnable);
  35.  
    }
  36.  
     
  37.  
    executorService.shutdown();
  38.  
     
  39.  
    }
  40.  
     
  41.  
    }

java高级之信号灯Semaphore的更多相关文章

  1. java高级---->Thread之Semaphore的使用

    Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数,并提供了同步机制.今天我们就学习一下Semaphore的用法. java中多线程Semaphore的使用 关于Semapho ...

  2. Java并发编程:Semaphore、CountDownLatch、CyclicBarrier

    首先我们来实现一个功能:当我们启动一个系统的时候需要初始化许多数据,这时候我们可能需要启动很多线程来进行数据的初始化,只有这些系统初始化结束之后才能够启动系统.其实在Java的类库中已经提供了Sema ...

  3. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  4. paip.java 架构师之路以及java高级技术

    paip.java 架构师之路以及java高级技术 1.    Annotation 设计模式... 概念满天飞.ORM,IOC,AOP. Validator lambda4j memcache. 对 ...

  5. paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型

    paip.java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...

  6. Java高级之线程同步

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 关于实现多线程的意义,"从业四年看并发"一文已经讲述,而本篇主要讲一下常用的设计 ...

  7. Java高级之类结构的认识

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! Java体系包括,各种版本的虚拟机,可执行文件,各种第三方类库,Java API类库,Java语言 ...

  8. Java高级软件工程师面试考纲(转)

    如果要应聘高级开发工程师职务,仅仅懂得Java的基础知识是远远不够的,还必须懂得常用数据结构.算法.网络.操作系统等知识.因此本文不会讲解具体的技术,笔者综合自己应聘各大公司的经历,整理了一份大公司对 ...

  9. Java高级软件工程师面试考纲

    如果要应聘高级开发工程师职务,仅仅懂得Java的基础知识是远远不够的,还必须懂得常用数据结构.算法.网络.操作系统等知识.因此本文不会讲解具体的技术,笔者综合自己应聘各大公司的经历,整理了一份大公司对 ...

随机推荐

  1. [LOJ6278]数列分块入门 2

    题目大意: 给你一个长度为$n(n\leq 50000)$的序列$A$,支持进行以下两种操作: 1.将区间$[l,r]$中所有数加上$c$: 2.询问区间$[l,r]$中小于$c^2$的数的个数.思路 ...

  2. IOS8设备连接XCODE6真机调试报错"Could not inspect the application package"

    每次真机调试都要运行2次才行,解决办法:把product name改成英文就行了.

  3. delphi crc校验函数

    function CalCRC16(AData: array of Byte; AStart, AEnd: Integer): string;const  GENP=$8408;  //多项式公式X1 ...

  4. 本地缓存localstorage使用

    最近做项目遇到一个问题,即从“个人中心”点击进入“修改支付宝”,需要自动获取用户手机号怎么做? 修改支付宝的api不提供用户手机号数据,但是发现个人中心提供,于是想通过localstorage在个人中 ...

  5. ubuntu配置无密码登录

    1 本地生成ssh公钥和私钥, 2将公钥拷贝到ubuntu上的.ssh/authorized_keys 中

  6. ES6里的解构赋值

    我们经常定义许多对象和数组,然后有组织地从中提取相关的信息片段.在ES6中添加了可以简化这种任务的新特性:解构.解构是一种打破数据结构,将其拆分为更小部分的过程. 一.引入背景 在ES5中,开发者们为 ...

  7. 浅谈C#委托和事件(转载)

    委托给了C#操作函数的灵活性,我们可使用委托像操作变量一样来操作函数,其实这个功能并不是C#的首创,早在C++时代就有函数指针这一说法,而在我看来委托就是C#的函数指针,首先先简要的介绍一下委托的基本 ...

  8. Solr6.6.0 用 SimplePostTool索引文件

    一.背景介绍 Solr启动并运行之后,并不包含任何数据,在solr的安装目录下的bin目录中,有一个post工具,我们可以使用这个工具往solr上传数据,这个工具必须在命令行中执行,post工具是一个 ...

  9. python 小技巧(glob,guid,序列化,压缩字符,有序字典,sorted函数,分片)

    1.glob模块 glob模块是最简单的模块之一,内容非常少.用它可以查找符合特定规则的文件路径名.跟使用windows下的文件搜索差不多.查找文件只用到三个匹配符:”*”, “?”, “[]”.”* ...

  10. Angular 学习笔记——service &constant

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...