讲师中心 微信公众号
AI工具推荐 视频效率加速

Java多线程处理_Java多线程数据处理与同步技巧

星辰吖_4140

星辰吖_4140

发布时间:2026-01-22 12:14:46

|

805人浏览过

|

来源于php中文网

原创

多线程共享变量未加锁会导致脏读、丢失更新等数据不一致问题,根本原因是JVM内存模型下线程缓存副本不一致;应依场景选用AtomicInteger、synchronized、ConcurrentHashMap等线程安全方案,并注意ThreadLocal泄漏、CompletableFuture异常吞没及线程池拒绝策略配置。

java多线程处理_java多线程数据处理与同步技巧

多线程共享变量没加锁,结果总对不上

Java里多个线程同时读写同一个int、ArrayList或自定义对象字段时,不加同步机制,大概率出现脏读、丢失更新。这不是“偶尔出错”,而是JVM内存模型决定的:线程可能一直用自己缓存的副本,根本看不到别的线程改过的值。

实操建议:

立即学习“Java免费学习笔记(深入)”;

  • 简单计数优先用AtomicInteger,它靠CAS指令保证原子性,比synchronized轻量;
  • 逻辑复杂(比如先查再改)必须用synchronized块或ReentrantLock,锁对象要明确——别用this或临时对象,推荐用私有final对象:private final Object lock = new Object();;
  • ArrayList、HashMap这些非线程安全集合,别想着“我只读不写就没事”——迭代过程中另一个线程修改结构,会直接抛ConcurrentModificationException;
  • 真要共享集合,用CopyOnWriteArrayList(适合读多写少)、ConcurrentHashMap(高并发场景),但注意它们的弱一致性:size()可能不是实时准确值。

用ExecutorService提交任务,线程池拒绝策略怎么选

直接new Thread().start()在高并发下会OOM,必须用线程池。但队列满了、核心线程全忙时,新任务怎么处理?默认的AbortPolicy直接抛RejectedExecutionException,线上服务扛不住。

实操建议:

立即学习“Java免费学习笔记(深入)”;

  • 吞吐优先且允许丢弃:用DiscardPolicy(静默丢弃)或DiscardOldestPolicy(丢最老的,给新任务腾位置);
  • 业务不允许丢任务:自定义RejectedExecutionHandler,把任务转存到Kafka或数据库,后续重试;
  • 别盲目调大LinkedBlockingQueue容量——无界队列会让内存持续增长,最终OOM;
  • 监控关键指标:线程池getActiveCount()、getQueue().size()、getCompletedTaskCount(),异常飙升说明配置不合理或下游慢。

ThreadLocal用完不remove,导致内存泄漏

ThreadLocal本意是让每个线程独享变量副本,但它的底层实现是把值存在当前线程的ThreadLocalMap里,而这个map的key是ThreadLocal的弱引用。如果线程长期存活(比如线程池里的线程),value却一直强引用着,GC无法回收value,就会泄漏。

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载

实操建议:

立即学习“Java免费学习笔记(深入)”;

  • 每次用完必须显式调用threadLocal.remove(),尤其在try-finally里;
  • 不要把大对象(如Connection、InputStream)塞进ThreadLocal;
  • Web应用中,过滤器或拦截器里设了ThreadLocal,务必在响应结束前清理——Spring的RequestContextHolder.resetRequestAttributes()就是干这事的;
  • 排查泄漏:用MAT分析堆dump,搜ThreadLocalMap下的value,看是不是持有不该持有的类实例。

CompletableFuture异步链里异常被吞掉

写supplyAsync().thenApply().thenAccept()时,如果中间某个阶段抛了未检查异常(比如NullPointerException),默认不会打印堆栈,也不会中断流程——除非你显式调用join()或get(),否则异常就静默消失了。

实操建议:

立即学习“Java免费学习笔记(深入)”;

  • 所有thenApply、thenAccept之后,加上exceptionally()或handle()捕获异常;
  • 不要在thenRun()里做耗时操作,它运行在ForkJoinPool.commonPool(),阻塞会导致整个公共池卡死;
  • 需要指定线程池执行后续阶段,用thenApplyAsync(fn, executor),别依赖默认池;
  • 组合多个CompletableFuture时,用allOf()或anyOf()后,记得对每个子future单独join()或get(),否则拿不到具体哪个失败了。

多线程最难的不是语法,是判断哪段代码真正需要同步、哪个对象该当锁、线程生命周期和业务生命周期是否对齐。很多问题在线上压测才暴露,因为低并发时竞争不激烈,掩盖了数据不一致或资源泄漏。

热门AI工具

更多
立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2191

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

417

2026.01.26

kafka消费者组有什么作用
kafka消费者组有什么作用

kafka消费者组的作用:1、负载均衡;2、容错性;3、广播模式;4、灵活性;5、自动故障转移和领导者选举;6、动态扩展性;7、顺序保证;8、数据压缩;9、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2246

2024.01.12

kafka消费组的作用是什么
kafka消费组的作用是什么

kafka消费组的作用:1、负载均衡;2、容错性;3、灵活性;4、高可用性;5、扩展性;6、顺序保证;7、数据压缩;8、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

550

2024.02.23

rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

524

2024.02.23

Java 流式处理与 Apache Kafka 实战
Java 流式处理与 Apache Kafka 实战

本专题专注讲解 Java 在流式数据处理与消息队列系统中的应用,系统讲解 Apache Kafka 的基础概念、生产者与消费者模型、Kafka Streams 与 KSQL 流式处理框架、实时数据分析与监控,结合实际业务场景,帮助开发者构建 高吞吐量、低延迟的实时数据流管道,实现高效的数据流转与处理。

570

2026.02.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5259

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2685

2024.08.29

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

80

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn