计数信号量用来控制同时访问某个特定资源的操作数量。Semaphore可以用于实现资源池,例如数据库连接池。我们可以构造一个固定长度的资源池,当资源池为空的时候,请求资源将会阻塞,而不是失败。当资源池非空的时候解除阻塞。如果将Semaphore的计数值初始化为池的大小,在池中获取一个资源之前首先调用Semopore.acquire()方法获取一个许可,当池为空的时候将阻塞到池非空为止。使用完毕的时候,调用Semophore.release()方法释放许可。
信号量好比现在厕所就有5个坑,等待上厕所的人数为10。因为每次只能同时5个人占用坑,所以其他10人必须等待,直到5个人中有一个人使用完,另外10个人中的一人才能去使用坑,以此类推。下面用代码模拟以下,如下:
package semaphore.semaphore; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class SemaphoreDemo { public static void main(String[]args){ //线程池 ExecutorService exec=Executors.newCachedThreadPool(); //初始化信号量 final Semaphore semaphore=new Semaphore(5); //开启10个线程 for(int i=1;i<=10;i++){ final int num=i; Thread thread=new Thread(new Runnable() { public void run() { try { //获取许可 semaphore.acquire(); System.out.println("Accessing:"+num); Thread.sleep((long) (Math.random()*10000)); //访问完毕释放 semaphore.release(); System.out.println("----------"+num); } catch (InterruptedException e) { e.printStackTrace(); } } }); exec.execute(thread); } exec.shutdown(); } }
运行结果如下:
参考地址:JAVA并发编程实战
http://www.cnblogs.com/whgw/archive/2011/09/29/2195555.html