资讯专栏INFORMATION COLUMN

Spring Boot中的并发处理

社区管理员 / 2085人阅读

在使用Spring Boot开发过程中,并发concurrency问题不可避免。很多开发者存在这样的误区,使用Servlets为每个请求分配一个新的线程进行处理就不再需要并发处理了。我将在这篇文章中介绍如何在Spring Boot中处理并发并且如何避免一些问题。

Spring Boot 并发基础

有以下几点特别值得注意:

  1. 最大线程数:这是为处理应用程序的请求而分配的最大线程数。

  2. 共享资源:调用共享资源如数据库

  3. 异步方法调用:这些方法调用将会释放线程资源

  4. 内部共享资源:内部资源调用如缓存、共享应用程序状态

接下来我们逐一介绍如何处理这些场景

Spring Boot应用程序的最大线程数量

首先我们必须限制应用程序的线程数量。如果使用默认内嵌的Tomcat Server,我们可以通过server.tomcat.max-threads变量修改线程数量限制。默认为200。我们可以通过修改此配置以更合理利用硬件资源。

共享外部资源

调用数据库或者第三方Restful接口可能需要很长时间。

异步方法调用

我们可能遇到一个请求会调用多个服务。比如一次请求调用Service A、B、C,你肯定不想这样调用:

Call service A -> Waiting response from Service A -> call service B -> Watiting ... -> Compose response from A B C

每个服务调用花费三秒,整个请求处理过程将会花费9秒。如果通过下面的做法肯定会更好。

Call service A 
Call serviec B -> Waiting response from Service A B C -> compose reponse from A B C 
Call serviec C

这样,显然我们只需要3秒响应。 异步和响应式微服务十分有趣,可以参考其他文章。这里我们只关注Spring boot

Spring Boot中异步调用

Spring Boot中使用注解@EnabelAsync注解开启异步支持。使用@Async将返回CompletableFuture<> 。这些异步方法将会在后台线程中执行。如果合理使用异步执行,可以避免等待时间。

共享内部资源

以上我们讨论了我们无法控制的外部资源,对于系统内部资源我们应该避免共享他们。Spring Service and Controller都是单例模式,我们需要十分小心,当状态改变时,你需要立刻处理。共享状态的其他潜在来源是高速缓存和自定义服务器范围的组件(通常是监视,安全性等)。如果你必须使用共享状态资源,下面是我的建议:

  1. 处理不可变对象。如果对象是不可变的,则可以避免许多与并发相关的问题。如果你需要改变一些东西 - 只需创建一个新对象。

  2. 并非所有集合都是线程安全的。一个常见的陷阱是使用HashMap,假设它是线程安全的(它不是。如果你需要并发访问,请使用ConcurrentHashMap,HashTable或其他线程安全的解决方案。)。

  3. 不要假设第三方库是线程安全的。大多数代码都没有,并且必须控制对共享状态的访问。

  4. 如果你要依赖它 - 学习正确的并发性。我真的建议在实践中获得Java Concurrency的副本。写于2006年,但在2018年仍然非常相关。

总结

Spring中的并发和多线程是重要的主题。在本文中,我想强调在编写Spring Boot应用程序时需要注意的关键领域。如果您想在构建高要求,高质量的服务时取得成功,您需要围绕这一主题做出有意识的决策和权衡。我希望通过这篇文章你知道如何开始


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/127924.html

相关文章

  • Spring Boot 最流行的 16 条实践解读!

    摘要:来源是最流行的用于开发微服务的框架。以下依次列出了最佳实践,排名不分先后。这非常有助于避免可怕的地狱。推荐使用构造函数注入这一条实践来自的项目负责人。保持业务逻辑免受代码侵入的一种方法是使用构造函数注入。 showImg(https://mmbiz.qpic.cn/mmbiz_jpg/R3InYSAIZkHQ40ly9Oztiart2lESCyjCH0JwFRp3oErlYobhibM...

    Ethan815 评论0 收藏0
  • 【推荐】最新200篇:技术文章整理

    摘要:作为面试官,我是如何甄别应聘者的包装程度语言和等其他语言的对比分析和主从复制的原理详解和持久化的原理是什么面试中经常被问到的持久化与恢复实现故障恢复自动化详解哨兵技术查漏补缺最易错过的技术要点大扫盲意外宕机不难解决,但你真的懂数据恢复吗每秒 作为面试官,我是如何甄别应聘者的包装程度Go语言和Java、python等其他语言的对比分析 Redis和MySQL Redis:主从复制的原理详...

    BicycleWarrior 评论0 收藏0
  • 【推荐】最新200篇:技术文章整理

    摘要:作为面试官,我是如何甄别应聘者的包装程度语言和等其他语言的对比分析和主从复制的原理详解和持久化的原理是什么面试中经常被问到的持久化与恢复实现故障恢复自动化详解哨兵技术查漏补缺最易错过的技术要点大扫盲意外宕机不难解决,但你真的懂数据恢复吗每秒 作为面试官,我是如何甄别应聘者的包装程度Go语言和Java、python等其他语言的对比分析 Redis和MySQL Redis:主从复制的原理详...

    Mr_houzi 评论0 收藏0
  • 【推荐】最新200篇:技术文章整理

    摘要:作为面试官,我是如何甄别应聘者的包装程度语言和等其他语言的对比分析和主从复制的原理详解和持久化的原理是什么面试中经常被问到的持久化与恢复实现故障恢复自动化详解哨兵技术查漏补缺最易错过的技术要点大扫盲意外宕机不难解决,但你真的懂数据恢复吗每秒 作为面试官,我是如何甄别应聘者的包装程度Go语言和Java、python等其他语言的对比分析 Redis和MySQL Redis:主从复制的原理详...

    tommego 评论0 收藏0
  • Java并发:分布式应用限流 Redis + Lua 实践

    摘要:对此,为了减少资源浪费,减轻后端压力,我们还需要对秒杀进行限流,只需保障部分用户服务正常即可。分布式限流单机限流,可以用到这些。但是在分布式中,就不能使用了。本文不涉及,简单介绍分布式限流的实现。 任何限流都不是漫无目的的,也不是一个开关就可以解决的问题,常用的限流算法有:令牌桶,漏桶。在之前的文章中,也讲到过,但是那是基于单机场景来写。 之前文章:接口限流算法:漏桶算法&令牌桶算法 ...

    alogy 评论0 收藏0
  • 《Java编程方法论:响应式RxJava与代码设计实战》序

    摘要:原文链接编程方法论响应式与代码设计实战序,来自于微信公众号次灵均阁正文内容在一月的架构和设计趋势报告中,响应式编程和函数式仍旧编列在第一季度的早期采纳者中。 原文链接:《Java编程方法论:响应式RxJava与代码设计实战》序,来自于微信公众号:次灵均阁 正文内容 在《2019 一月的InfoQ 架构和设计趋势报告》1中,响应式编程(Reactive Programming)和函数式...

    PAMPANG 评论0 收藏0

发表评论

0条评论

社区管理员

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<