【踩坑实录】生产上遇到的并发问题总结

生产上遇到很多并发问题,有很多是在编码阶段就可以避免的,总结一些需要考虑的要点如下:

  1. 使用并发的常见场景为针对大数据量遍历处理,考虑性能,采用并发处理。这是CPU密集型任务场景,同时出现多个任务时,性能不见得最优。
  2. 并发也有开销,不建议无脑并发。并发后堆栈会丢失,不方便排查问题。
  3. 异步开发模式具有传染性,比如使用可回调 Future 后,如果想要避免阻塞问题,需要使用map、flatMap语义。折中的方法是参考结构化并发,在必要位置等待,获取结果后清理资源。
  4. 需要注意副作用,尽量不要使用副作用。尽量不要修改共享的内容,比如本地缓存。
  5. 使用线程安全类 + 原子方法, ConcurrentHashMap 和 HashMap 相比,性能差别不大,而且内存占用基本一致,很多情况下可以直接替换。灵活使用 merge、computeIfAbsent 等方法,比如需要择优的场景,不需要重复写写命令式的逻辑。
  6. 考虑单次加载实现
  7. ConcurentHashMap 高并发时,可能有阻塞等待同一个桶位的问题,必须指定初始大小。
  8. 考虑线程池阻塞队列消费速度,防止某些捣蛋线程。
  9. 考虑处理拒绝任务异常,设计 fallback 策略。
  10. 并发超时或者任务取消时很容易出现线程泄露。
  11. 监控并发收益。
  12. 监控阻塞线程,防止惊群效应。
相关推荐
晨曦中的暮雨2 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
喵了几个咪3 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang
Flynt3 小时前
我把微信运动的排行榜和定点推送复刻了一遍:100万次步数更新只要4秒,坑在别处
redis·后端·性能优化
文丑颜不良啊4 小时前
LeetCode876~900题目解析
java·leetcode
aloha_7894 小时前
Java 基础、集合、异常与 JUnit 5 速查
java·junit·sqlserver
wuyk5554 小时前
防逆向基础:在量产固件中关闭调试接口并设置读保护(RDP)的正确姿势
stm32·单片机·嵌入式硬件·性能优化·重构
知守观5 小时前
设计模式实战:从真实老项目中看标准模板方法与工厂的落地
java·spring·设计模式
独隅5 小时前
Claude API 实战教程:从入门到完整项目
android·java·数据库·claude·claude code
打工仔折腾 AI5 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
_孤傲_5 小时前
快速掌握 MySQL 语法
数据库·后端·mysql