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. Git:将本地项目连接到远程(github、gitee、gitlab)仓库流程

    当进行协同开发或者为了代码安全备份需要,一般都会将本地代码和远程仓库相连接. 备注:Github.Gitee.Gitlab是三个常用的远程git仓库,操作流程基本一致. 提前环境要求: 1.node. ...

  2. BigDecimal 的用法

    1.初始化 BigDecimal discount=new BigDecimal(0.9); BigDecimal discount=new BigDecimal(200); 2.加减乘除 加法 ad ...

  3. Vue实现active点击切换

    Vue实现active点击切换 循环的情况: 1.点击时传入index索引(获取当前点击的是哪个) @click=“active(index)” 2.将索引值传入class(索引等于几就第几个添加ac ...

  4. org.hibernate.hql.ast.QuerySyntaxException: tb_voteoption is not mapped [from tb_voteoption where voteID=?]

    转自:https://www.cnblogs.com/albert1017/archive/2012/08/25/2656873.html org.hibernate.hql.ast.QuerySyn ...

  5. Object of type 'ndarray' is not JSON serializable

    Object of type 'ndarray' is not JSON serializable import numpy as np import json arr=np.asarray([345 ...

  6. JVM Heap Memory和Native Memory

    JVM管理的内存可以总体划分为两部分:Heap Memory和Native Memory.前者我们比较熟悉,是供Java应用程序使用的:后者也称为C-Heap,是供JVM自身进程使用的.Heap Me ...

  7. ASE Beta Sprint - backend scrum 4

    本次scrum于2019.12.10在sky garden进行,持续10分钟. 参与人: Xin Kang, Zhikai Chen, Lihao Ran, Hao Wang 请假: Ning Jia ...

  8. 09.Linux系统由于不正常关机导致的分区问题

    问题:Error:UNEXPECTED INCONSISTENCY: RUN fsck MANUALLY Give root password for maintenance ------------ ...

  9. python基础模块,包

    #import cal,time #导入模块名可以看作导入一个变量 #from cal import add # from cal import *#引入所有变量 *代表所有 占内存 不推荐 # # ...

  10. oralce 汇编02

    Assembler Directives .align integer, padThe .align directive causes the next data generated to be al ...