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();
}
本文深入探讨了信号量在程序中的应用,特别是在限流场景下如何通过信号量来控制并发线程的数量。通过示例代码展示了信号量的工作原理:线程在执行任务前必须获取许可证,完成任务后归还许可证,从而实现对并发访问的有效控制。
1117

被折叠的 条评论
为什么被折叠?



