• 什么是Semaphore 
    Semaphore可以控制某个资源可被同时访问的个数(locks和synchronized锁,在任何时刻只允许一个任务访问一个资源),通过acquire()获取一个许可,如果没有则等待,release()释放一个许可。可以将Semaphore看成分发许可证,只有分到许可的线程才能访问线程,访问资源完毕后需要返还许可,以便让等待的线程获取许可访问资源。 
    Semaphore有两个构造函数,Semaphore(int)和Semaphore(int,boolean)。参数中的int表示该信号量拥有的许可数量,boolean表示获取许可的时候是否是公平的,如果是公平的那么,当有多个线程要获取许可时,会按照线程来的先后顺序分配许可,否则,线程获得许可的顺序是不定的。

  • 一个实例

    public class TestSemaphore {
    public static void main(String[] args) {
    // 线程池
    ExecutorService exec = Executors.newCachedThreadPool();
    //一次只能5个线程同时访问
    final Semaphore semp = new Semaphore(5);
    // 模拟20个客户端访问
    for (int index = 0; index < 20; index++) {
    final int NO = index;
    Runnable run = new Runnable() {
    public void run() {
    try {
    // 获取许可
    semp.acquire();
    System.out.println("Accessing: " + NO);
    Thread.sleep((long) (Math.random() * 10000));
    // 访问完后,释放
    semp.release();
    System.out.println("-----------------"+semp.availablePermits());
    } catch (InterruptedException e) {
    e.printStackTrace();
    } } };
    exec.execute(run);
    } // 退出线程池
    exec.shutdown(); }
    }
  • 执行结果

    Accessing: 0
    Accessing: 1
    Accessing: 2
    Accessing: 3
    Accessing: 4
    -----------------0
    Accessing: 5
    -----------------1
    Accessing: 6
    -----------------1
    Accessing: 7
    -----------------1
    Accessing: 8
    -----------------1
    Accessing: 9
    -----------------1
    Accessing: 10
    -----------------1
    Accessing: 11
    -----------------1
    Accessing: 12
    -----------------1
    Accessing: 13
    -----------------1
    Accessing: 14
    -----------------1
    Accessing: 15
    -----------------1
    Accessing: 16
    -----------------1
    Accessing: 17
    -----------------1
    Accessing: 18
    -----------------1
    Accessing: 19
    -----------------1
    -----------------2
    -----------------3
    -----------------4
    -----------------5

      

    同时有五个线程可以执行,获取资源后打印语句后随机睡眠,最后释放资源,semp.availablePermits(),可以获得的许可数量,是放一个后将有一个没有被分发的许可证,当有多的许可证时,会采取先到先得的方式分配许可。Semaphore实际上没有使用任何许可证对象,只是以打比方的方式来说明是如何执行的。

java并发中的Semaphore的更多相关文章

  1. 深入浅出Java并发中的CountDownLatch

      1. CountDownLatch 正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中 ...

  2. java并发中CountDownLatch的使用

    文章目录 主线程等待子线程全都结束之后再开始运行 等待所有线程都准备好再一起执行 停止CountdownLatch的await java并发中CountDownLatch的使用 在java并发中,控制 ...

  3. java并发中ExecutorService的使用

    文章目录 创建ExecutorService 为ExecutorService分配Tasks 关闭ExecutorService Future ScheduledExecutorService Exe ...

  4. java并发中的Synchronized关键词

    文章目录 为什么要同步 Synchronized关键词 Synchronized Instance Methods Synchronized Static Methods Synchronized B ...

  5. Java 并发专题 : Semaphore 实现 互斥 与 连接池

    继续并发方面的知识.今天介绍Semaphore,同样在java.util.concurrent包下. 本来准备通过例子,从自己实现到最后使用并发工具实现,但是貌似效果并不是很好,有点太啰嗦的感觉,所有 ...

  6. java并发编程之一--Semaphore的使用

    1.介绍 Semaphore 中文的含义 信号,信号系统,此类的只要作用就是限制线程的并发的数量. Semaphore内部主要通过AQS(AbstractQueuedSynchronizer)实现线程 ...

  7. JAVA并发框架之Semaphore实现生产者与消费者模型

    分类: Java技术      锁和信号量(Semaphore)是实现多线程同步的两种常用的手段.信号量需要初始化一个许可值,许可值可以大于0,也可以小于0,也可以等于0.      如果大于0,表示 ...

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

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

  9. Java并发系列[6]----Semaphore源码分析

    Semaphore(信号量)是JUC包中比较常用到的一个类,它是AQS共享模式的一个应用,可以允许多个线程同时对共享资源进行操作,并且可以有效的控制并发数,利用它可以很好的实现流量控制.Semapho ...

随机推荐

  1. android手机短信获取

    关于Android中对短信的一些相关操.我看到一个文章下面我就从标题中的三个方面来对Android系统中的短信操作进行一个简单地学习. 短信发送: 由于Android中对短信发送方法的优良封装,之后对 ...

  2. .NetCore WebApi

    1.简单请求 [HttpGet] public ActionResult Get(int id) Postman: api / controller / action?id=1 2.form-data ...

  3. SQL server 2012安装中出现的INSTALLSHAREDDIR 和 INSTALLSHAREDWOWDIR 参数具有相同的值问题

    出现的问题如下: INSTALLSHAREDDIR 和 INSTALLSHAREDWOWDIR 参数具有相同的值“D:\soft\sql”.但是,这些参数必须具有不同的值.请为其中一个参数指定不同的值 ...

  4. Assignments 1

    跑了一下之前写的UiPath Assignments脚本,没什么问题,发上来供大家参考. 先看结果: github:https://github.com/WendyZheng1022/RPA 有时间我 ...

  5. rtmp详解

    文件下载地址: 中文:https://files.cnblogs.com/files/bugutian/rtmp_specification_1.0_cn.zip 英文:http://www.adob ...

  6. linux jpg文件查找木马

    find ./ -type f -name "*.jpg" | xargs grep "eval"

  7. 跟随我在oracle学习php(11)

    数组专题 数组遍历: 1,普通for循环,经常用的数组遍历 var arr = [1,2,0,3,9]; for ( var i = 0; i <arr.length; i++){ consol ...

  8. 第三天:numpy库

    PS: 这个好像是Python2.X版本的使用. 这个课件的numpy的介绍还是太少了,有点凌乱的感觉,要是后面还是要以<利用Python进行数据分析>做numpy和pandas课件笔记比 ...

  9. Tensorflow常用的函数:tf.cast

    1.tf.cast(x,dtype,name) 此函数的目的是为了将x数据,准换为dtype所表示的类型,例如tf.float32,tf.bool,tf.uint8等 example:  import ...

  10. styled-components 背后的魔法

    styled-components 定义组件的风格为 const Button = styled.button` background-color: papayawhip; border-radius ...