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. 菜鸟程序员成长史 --记 Github 1000+ contributions

    其实一直以来想写一篇文章总结这几年的技术学习,刚好趁着自己的第一次github contribution 达到1000+,写篇文章总结以下.本文篇幅较长,我会分为几个章节来分别阐述. 博客篇 为什么我 ...

  2. Latex--入门系列三

    Latex 专业的参考 tex对于论文写作或者其他的一些需要排版的写作来说,还是非常有意义的.我在网上看到这个对于Latex的入门介绍还是比较全面的,Arbitrary reference .所以将会 ...

  3. jQuery中attr()和prop()及removeAttr()和removeProp()的区别

    在jquery1.6之前的所有版本中设置和获取元素属性(固有属性和自定义属性)都使用attr方法,后来单独把设置和获取元素固有属性单独做成了prop()方法. 一般来说: 对于HTML元素本身就带有的 ...

  4. c#中decimal的去0显示

    在近来的开发中,遇到到了decimal中显示0的问题,搞了很久才搞好了,现在就简单介绍一下其中一小部分,其他的网上很上很多 public static string DecimalToString(d ...

  5. RSA加密原理与秘钥、公钥生成

    RSA加密(非对称加密) RSA公开密钥密码体制.所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制.(不可逆向运算的加密方法) ...

  6. pgtksh -- PostgreSQL Tcl/Tk shell 客户端

    SYNOPSIS pgtksh [filename [argument...]] DESCRIPTION 描述 pgtksh 是一个带有 PostgreSQL 数据库访问函数扩展的 Tcl/Tk sh ...

  7. 【leetcode】1078. Occurrences After Bigram

    题目如下: Given words first and second, consider occurrences in some text of the form "first second ...

  8. Task1.PyTorch的基本概念

    1.什么是Pytorch,为什么选择Pytroch? PyTorch的前身便是Torch,其底层和Torch框架一样,但是使用Python重新写了很多内容,不仅更加灵活,支持动态图,而且提供了Pyth ...

  9. Oracle分组函数之Grouping Sets

    功能介绍: 自定义分组的字段 创建表: 插入测试数据: Grouping Sets(null,t.classid,(t.classid,t.studentname)),类似于ROLLUP Select ...

  10. Leetcode_1278. Palindrome Partitioning III_[DP]

    题目链接 You are given a string s containing lowercase letters and an integer k. You need to : First, ch ...