你的问题要分开来看,线程数多了性能反而差和如何解决高并发问题两个问题
1.伴随线程数的加剧,cpu和内存的开销也会伴随着增长,最直观的体现的sys增长,分配给业务线程使用的cpu时钟相应会降低;其次线程分配的内存开销无疑家居了GC的开销,对吞吐的影响也是不低
2.如果VM和JVM并没有到瓶颈,这个时候需要考虑是否受限于锁和IO。举个例子logger同步锁和依赖的外部IO瓶颈
关于这个问题需要视情况而定了
1.如果是CPU密集型应用,IO并非瓶颈,可以考虑通过充分使用cpu核数来提高并行度,一般配置cpu core线程即可
2.如果是IO密集型应用,应用的瓶颈集中在外部IO,在外部IO负载范围内可以通过增加线程数的方式解决吞吐问题
3.如果计算任务涉及到锁竞争,可以考虑降低锁的粒度或者取消锁,举个例子ringbuffer
4.基于之上的场景如果需要继续提高并发度,可以考虑做一些热点优化,举个例子热点缓存优化,热点缓存本地优化(不过这个时候就需要考虑本地缓存的大小和失效时间,过长会导致老年代增长过快,触发FGC,这个时候反而得不偿失,经验值一般是20s之内)
5.有的时候也可以考虑用空间换时间,在一些数据封板的场景可以考虑预计算&缓存代替实时计算提高并发度
6.有的时候需要对业务逻辑进行裁剪,针对于不同场景进行计算流程的自定义,裁剪掉不必要的开销
7.一些中间件、jvm和os的优化就不在这个话题里描述了
可以使用线程池,是指管理一组同构工作线程的资源池。
线程池的本质就是:有一个队列,任务会被提交到这个队列中。一定数量的线程会从该队列中取出任务,然后执行。任务的结果可以发回客户端、可以写入数据库、也可以存储到内部数据结构中,等等。但是任务执行完成后,这个线程会返回任务队列,检索另一个任务并执行。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。