zoukankan      html  css  js  c++  java
  • Semaphore

    Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个release方法增加一个许可证,这可能会释放一个阻塞的acquire方法。然而,其实并没有实际的许可证这个对象,Semaphore只是维持了一个可获得许可证的数量。 
    Semaphore经常用于限制获取某种资源的线程数量。下面举个例子,比如说操场上有5个跑道,一个跑道一次只能有一个学生在上面跑步,一旦所有跑道在使用,那么后面的学生就需要等待,直到有一个学生不跑了

    如何获得Semaphore对象? 
        public Semaphore(int permits,boolean fair) 
        permits:初始化可用的许可数目。 
        fair: 若该信号量保证在征用时按FIFO的顺序授予许可,则为true,否则为false; 

    在很多情况下,可能有多个线程需要访问数目很少的资源。假想在服务器上运行着若干个回答客户端请求的线程。这些线程需要连接到同一数据库,但任一时刻 
        只能获得一定数目的数据库连接。你要怎样才能够有效地将这些固定数目的数据库连接分配给大量的线程? 
        
    答:1.给方法加同步锁,保证同一时刻只能有一个人去调用此方法,其他所有线程排队等待,但是此种情况下即使你的数据库链接有10个,也始终只有一个处于使

            用状态。这样将会大大的浪费系统资源,而且系统的运行效率非常的低下。


        2.另外一种方法当然是使用信号量,

    简单运用如下:

    package semaphore.two;

    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Semaphore;

    public class TestMain {
    static Semaphore semaphore=new Semaphore(5);
    static class Playground implements Runnable{
    private int i;

    public void beginRun() throws InterruptedException{
    //获取资源
    semaphore.acquire();
    System.out.println("第"+(i+1)+"次获取资源");
    //处理业务
    Thread.sleep(1000);
    System.out.println("第"+(i+1)+"释放资源");
    semaphore.release();
    }
    public Playground(int i) {
    this.i = i;
    }

    @Override
    public void run() {
    try {
    beginRun();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }

    }
    }
    public static void main(String[] args) throws InterruptedException{

    ExecutorService pool=Executors.newCachedThreadPool();
    for(int i=0;i<10;i++){
    Playground playground=new Playground(i);
    pool.execute(playground);
    }
    pool.shutdown();

    }
    }


     
    ---------------------
    作者:zz的的
    来源:CSDN
    原文:https://blog.csdn.net/weixin_40839342/article/details/81186710
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    笔记-迎难而上之Java基础进阶4
    笔记-迎难而上之Java基础进阶3
    笔记-迎难而上之Java基础进阶1
    7天学完Java基础之7/7
    Java学习笔记(3)--- 内部类,基本数据类型
    C++ 基础语法 快速复习笔记(3)---重载函数,多态,虚函数
    C++ 基础语法 快速复习笔记---面对对象编程(2)
    C++ 基础语法 快速复习笔记(1)
    堆与栈(heap and stack)在c/c++的应用(概念)
    Python爬虫入门教程 5-100 27270图片爬取
  • 原文地址:https://www.cnblogs.com/happyliuyi/p/10197023.html
Copyright © 2011-2022 走看看