1.在概念上,信号量维持一组许可证。 如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它。 每个release()添加许可证,潜在地释放阻塞获取方。 但是,没有使用实际的许可证对象; Semaphore只保留可用数量的计数,并相应地执行。
2.信号量通常用于限制线程数,而不是访问某些(物理或逻辑)资源。
//Semaphore主要用于限流
// 在获得项目之前,每个线程必须从信号量获取许可证,以确保某个项目可用。 当线程完成该项目后,它将返回到池中,
// 并将许可证返回到信号量,允许另一个线程获取该项目。 请注意,当调用acquire
final int MAX_AVAILABLE = 4;
Semaphore available = new Semaphore(MAX_AVAILABLE, true);
for(int i =0;i<10;i++){
new Thread(()->{
try {
available.acquire(); //加锁
System.out.println(Thread.currentThread().getName()+"****加锁");
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println(Thread.currentThread().getName()+"****减锁");
available.release(); //释放
}
}).start();
}