除了锁之外,并发API也支持计数的信号量。不过锁通常用于变量或资源的互斥访问,信号量可以维护整体的准入许可。这在一些不同场景下,例如你需要限制你的程序某个部分的并发访问总数时非常实用。
ExecutorService service=Executors.newFixedThreadPool(10);
Semaphore semaphore=new semaphore(5);
Runnable task=new Runnable(){
boolean permit=false;
public void run(){
try{
permit=semaphore.tryAcquire(1,TimeUnit.SECONDS);
if(permit){
System.out.println("ok");
Thread.sleep(5000);
}else{
System.out.println("no");
}
}catch(Exception e){
}finally{
semaphore.release();
}
}
}
for(int i=0;i<10;i++){
service.submit(task);
}