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
版权声明:本文为博主原创文章,转载请附上博文链接!

posted on 2018-12-29 17:07  happy刘艺  阅读(121)  评论(0编辑  收藏  举报

导航