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. POJ 1795 DNA Laboratory(状压DP)

    [题目链接] http://poj.org/problem?id=1795 [题目大意] 给出n个字符串,求一个最小长度的串,该串包含给出的所有字符串. 要求长度最小且字典序最小. [题解] dp[i ...

  2. [BZOJ5110]Yazid的新生舞会

    题目大意: 给你一个长度为$n(n\leq 5\times 10^5)$的序列$A_{1\sim n}$.求满足区间众数在区间内出现次数严格大于$\lfloor\frac{r-l+1}{2}\rflo ...

  3. 3.1常用类(java学习笔记)包装类及日期类

    一.包装类 java是一门面向对象的语言,秉承一切皆对象的思想. 可java中有一些基本数据类型并不是对象,有时可能需要将它们变为对象. 这时就需要用到我们的包装类了. 基本数据类型 包装类 int ...

  4. (转)Unity3D研究院之游戏架构脚本该如何来写(三十九)

     这篇文章MOMO主要想大家说明一下我在Unity3D游戏开发中是如何写游戏脚本的,对于Unity3D这套游戏引擎来说入门极快,可是要想做好却非常的难.这篇文章的目的是让哪些已经上手Unity3D游戏 ...

  5. 博客 | 基于Travis CI实现Hexo在Github和Coding的同步自动化部署

    文章目录 完成Hexo主题安装和配置 基于Travis CI实现同步部署 参考内容 相关链接 待补充 完成Hexo主题安装和配置 如果您还没有安装Hexo环境,请参考Hexo文档安装,也给出这样两篇博 ...

  6. bin/...的访问被拒绝被拒绝的问题

    复制到bin.... 对路径bin/.... 的访问被拒绝出现这们的问题,把源码管理器中项目的Bin目录删除,重新获取就要以了

  7. java实现随机中文

    原文:http://blog.csdn.net/u013926110/article/details/44600601 public class CreateCheckCode { /** * 生成随 ...

  8. JAVA常见算法题(二十四)

    package com.xiaowu.demo; //一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同. public class Demo24 { public ...

  9. gcc 4.8更新gcc 4.9 5.4版本等

    转载:http://www.linuxidc.com/Linux/2017-01/139976.htm 如果还在使用较旧版本的Ubuntu,或者是Ubuntu LTS,那么我们是很难体验新版gcc的. ...

  10. yolo.v2 darknet19结构

    Darknet19( (conv1s): Sequential( (0): Sequential( (0): Conv2d_BatchNorm( (conv): Conv2d(3, 32, kerne ...