Semaphore实现的功能就类似2个公用电话,假如有10个人要打电话;那么只能2个人占有电话,8个需要等待。
当2个人中 的任何一个人让开后,其中等待的另外8个人中又有一个人可以使用了
等待的8个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的参数选项。
单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了锁,再由另一个线程释放锁,这可应用于死锁恢复的一些场合。
Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。
Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可通过release() 释放一个许可

案例:

public class SemaphoreTest{
    public static void main(String[] args) {
        ExecutorService pool = Executors.newCachedThreadPool();
        //2个公用电话  可以通过true/false决定获取许可证顺序
        final  Semaphore sp = new Semaphore(2,true);
        //10个需要打电话
        for(int i=1;i<=10;i++){
            Runnable runnable = new Runnable(){
                public void run(){
                    try {
                        sp.acquire();
                    } catch (InterruptedException e1) {}

                    System.out.println("线程" + Thread.currentThread().getName() + "获取通话,当前还有" + sp.availablePermits()+ "个电话可以用");

                    try {
                        Thread.sleep((long)(Math.random()*1000));
                    } catch (InterruptedException e) {}
                    System.out.println("线程" + Thread.currentThread().getName() + "即将离开 ");
                    sp.release();
                }
            };
            pool.execute(runnable);
        }
        pool.shutdown();
    }
}

结果输出:

线程pool-1-thread-1获取通话,当前还有0个电话可以用
线程pool-1-thread-3获取通话,当前还有0个电话可以用
线程pool-1-thread-3即将离开
线程pool-1-thread-5获取通话,当前还有0个电话可以用
线程pool-1-thread-1即将离开
线程pool-1-thread-2获取通话,当前还有0个电话可以用
线程pool-1-thread-2即将离开
线程pool-1-thread-7获取通话,当前还有0个电话可以用
线程pool-1-thread-5即将离开
线程pool-1-thread-6获取通话,当前还有0个电话可以用
线程pool-1-thread-7即将离开
线程pool-1-thread-9获取通话,当前还有0个电话可以用
线程pool-1-thread-6即将离开
线程pool-1-thread-4获取通话,当前还有0个电话可以用
线程pool-1-thread-9即将离开
线程pool-1-thread-10获取通话,当前还有0个电话可以用
线程pool-1-thread-10即将离开
线程pool-1-thread-8获取通话,当前还有0个电话可以用
线程pool-1-thread-4即将离开
线程pool-1-thread-8即将离开

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

  1. java 5线程中 Semaphore信号灯,CyclicBarrier类,CountDownLatch计数器以及Exchanger类使用

    先来讲解一下Semaphore信号灯的作用:  可以维护当前访问自身的线程个数,并提供了同步机制, 使用semaphore可以控制同时访问资源的线程个数 例如,实现一个文件允许的并发访问数. 请看下面 ...

  2. Java多线程——Semaphore信号灯

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

  3. java Semaphore

    //Listing 6-4. Using a Counting Semaphore to Control Access to a Pool of Items import java.util.conc ...

  4. java Semaphore的介绍和使用

    一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可.每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者. ...

  5. ArrayBlockingQueue 阻塞队列和 Semaphore 信号灯的应用

    import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public cl ...

  6. System IPC 与Posix IPC(semaphore信号灯)

    POSIX下IPC主要包括三种: posix message queue posix semaphores posix shared memory sysytem v IPC包括: system v ...

  7. java Semaphore信号亮-同意多个任务同一时候訪问这个资源--thinking in java21.7.6

    package org.rui.thread.newc.semaphore; import java.util.ArrayList; import java.util.List; import jav ...

  8. java Semaphore实现ABC三个线程循环打印

    Semaphore位于java.util.concurrent包下.其中有两个重要的方法acquire()和release().acquire用来获取一个信号量,并且是阻塞型的,如果当前还有可用的信号 ...

  9. JAVA Semaphore详解

    Semaphore(信号量):是一种计数器,用来保护一个或者多个共享资源的访问.如果线程要访问一个资源就必须先获得信号量.如果信号量内部计数器大于0,信号量减1,然后允许共享这个资源:否则,如果信号量 ...

随机推荐

  1. VUE组件嵌套

    vue中组件嵌套烦分为两种,分别是全局注册组件和局部注册组件 基本步骤: 1.在components 下创建一个新的.vue结尾的文件,文件首字母最好是大写,基于规范复制代码 2.分别写出结构层< ...

  2. Storm分布式集群搭建

    一.storm版本 选用storm0.9.6 二.本地模式 用于对storm业务逻辑的调试和测试,可以直接在本地运行. 三.分布式模式 生产环境,需要对应的zookeeper.nimbus.super ...

  3. JFreeChart与struts2整合实例

    1. 3个jar包 jcommon,jfreechart,strust2-jfreechart-plugin 2 <?xml version="1.0" encoding=& ...

  4. postgresql Streaming Replication监控与注意事项

    一监控Streaming Replication集群 1 pg_stat_replication视图(主库端执行) pid Wal sender process的进程ID usesysid 执行流复制 ...

  5. 【记录】@Transactional

    参考链接:https://blog.csdn.net/nextyu/article/details/78669997 参考链接:https://www.xuebuyuan.com/3222458.ht ...

  6. git 操作遇到的问题与解决方法

    一.使用git在本地创建一个项目的过程,Git 上传本地文件到github $ makdir ~/hello-world //创建一个项目hello-world $ cd ~/hello-world ...

  7. vue中怎么使用vuex

    做一个简单的vuex如何使用的介绍: 先安装: npm i vuex --save-dev 新建一个store文件夹, 在store文件夹中建一个index.js文件,在该文件中:         i ...

  8. php similar_text()函数 语法

    php similar_text()函数 语法 作用:计算两个字符串的相似度,并返回匹配字符的数目大理石平台厂家 语法:similar_text(string1,string2,percent) 参数 ...

  9. BZOJ 3963: [WF2011]MachineWorks 斜率优化 + splay动态维护凸包

    Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先进的机械设备生产先进的机器.原来的那一台生产机器已经坏了,所以 ...

  10. 【HDOJ6635】Nonsense Time(时间倒流,lis)

    题意:给定n个数的数列,第i个数为a[i],刚开始所有位置都处于禁用状态,第i次之后位置p[i]变为可用,求每次变化后的lis长度 n,a[i],p[i]<=5e4 保证a[i],p[i]均为随 ...