开发者社区> 问答> 正文

[@项籍][¥20]多线程并发速度

JAVA线程并发数多之后速度会很慢,有没有什么好的办法解决高并发问题?

展开
收起
有点忧伤 2018-11-13 09:33:45 2108 0
2 条回答
写回答
取消 提交回答
  • 多年互联网开发经验,从事业务开发、平台开发、架构设计、云计算、APM等领域。目前专注于供应链方向的解决方案治理和服务交易域

    你的问题要分开来看,线程数多了性能反而差和如何解决高并发问题两个问题

    线程数多了性能反而差

    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的优化就不在这个话题里描述了

    2019-07-17 23:13:45
    赞同 展开评论 打赏
  • java 数据分析 数据可视化 大数据

    可以使用线程池,是指管理一组同构工作线程的资源池。

    线程池的本质就是:有一个队列,任务会被提交到这个队列中。一定数量的线程会从该队列中取出任务,然后执行。任务的结果可以发回客户端、可以写入数据库、也可以存储到内部数据结构中,等等。但是任务执行完成后,这个线程会返回任务队列,检索另一个任务并执行。

    2019-07-17 23:13:45
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
多IO线程优化版 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载