Semaphore和FixedThreadPool的区别

来源:10-5 Semaphore用法和注意点

woy

2020-02-19

老师, new FixedThreadPool(3) 它也可以保证同一时间只有3个任务在执行, 没必要使用信号量啊, 它们二者有啥区别呢?

写回答

1回答

悟空

2020-02-19

这是一个非常好的问题。让我们举一个在实际业务中会遇到的例子。比如我们在调用该“慢服务”前,需要有判断条件,比如我们只想在每天的0点整才会去访问这个“慢服务”,假设这个“慢服务”是“检查今天是否是星期日”。那么在大部分情况下(除了每天的0点),我们想要有更多的并发线程来提高性能,所以线程池的数量应该设置得大一些,而不仅仅是3个线程。此时我们就可以利用Semaphore来达到这个目的。

类似地,在大型应用程序中,会有不同类型的任务,通过不同的线程池来调用我们的“慢服务”,我们的调用方不仅仅是一个人,或者调用我们的直接是Tomcat服务器或者网关,我们就更不能限制,也不应该限制调用方的线程数量。

而一旦我们使用了Semaphore,由于信号量具有跨线程(跨线程池)的特性,那么即使这些请求来自于不同的线程池,我们也可以限制它们的访问。

基于以上的理由,如果想限制并发访问的线程数,用并发原语Semaphore是更合适的。


2
1
woy
非常感谢!
2020-02-19
共1条回复

深度解密Java并发工具,精通JUC,成为并发多面手

JUC全方位讲解,构建并发工具类知识体系

1599 学习 · 573 问题

查看课程