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

Java如何防止数据竞争_Java共享变量访问的正确姿势与同步手段

大墨君_1599

大墨君_1599

发布时间:2025-11-13 20:22:00

|

867人浏览过

|

来源于php中文网

原创

数据竞争源于多线程并发读写共享变量且缺乏同步;2. synchronized 可保证原子性与可见性,确保同一时刻仅一个线程执行临界区;3. volatile 保证变量可见性与禁止重排序,但不保证复合操作原子性;4. 原子类如 AtomicInteger 基于 CAS 实现高效无锁原子操作;5. 减少共享状态、使用不可变对象和 ThreadLocal 可从根本上避免数据竞争。

java如何防止数据竞争_java共享变量访问的正确姿势与同步手段

在多线程编程中,多个线程同时访问共享变量时容易引发数据竞争(Data Race),导致程序行为不可预测。Java 提供了多种机制来确保共享变量的正确访问,防止数据竞争。关键在于理解内存可见性、原子性和有序性,并合理使用同步手段。

理解数据竞争的根源

当多个线程并发读写同一个共享变量,且至少有一个是写操作,又没有适当的同步控制时,就会发生数据竞争。例如:

public class Counter {
    private int count = 0;

    public void increment() {
        count++; // 非原子操作:读-改-写
    }
}

上面的 count++ 实际包含三步:读取 count 值、加 1、写回。多个线程同时执行时,可能互相覆盖结果,最终值小于预期。

使用 synchronized 确保原子性与互斥访问

最直接的方式是使用 synchronized 关键字,它可以保证同一时刻只有一个线程能进入临界区。

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

public synchronized void increment() {
    count++;
}

或对代码块加锁:

public void increment() {
    synchronized(this) {
        count++;
    }
}

synchronized 不仅保证原子性,还确保了内存可见性——线程释放锁前会将修改刷新到主内存,获取锁后能看到最新的值。

利用 volatile 保证可见性与禁止重排序

如果共享变量只涉及单次读或写,且不需要复合操作的原子性,可以使用 volatile 关键字。

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

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

下载
private volatile boolean running = true;

volatile 能做到:

  • 写操作立即刷新到主内存
  • 读操作总是从主内存加载最新值
  • 禁止指令重排序,适用于双重检查锁定等场景

但注意:volatile 不能替代 synchronized,因为它不保证复合操作的原子性(如 i++)。

借助 java.util.concurrent.atomic 包实现无锁原子操作

对于简单的共享计数或状态标志,推荐使用原子类,如 AtomicInteger、AtomicBoolean 等。

private AtomicInteger count = new AtomicInteger(0);

public void increment() {
    count.incrementAndGet(); // 原子自增
}

这些类基于 CAS(Compare-And-Swap)机制,在高并发下性能优于 synchronized,适合计数器、状态标志等场景。

合理设计,减少共享状态

最根本的避免数据竞争的方法是尽量减少可变共享状态。可以通过以下方式:

  • 使用局部变量代替实例变量
  • 采用不可变对象(final 字段、String、Integer 等)
  • 使用 ThreadLocal 存储线程私有数据

不可变对象一旦创建就不能修改,天然线程安全。

基本上就这些。掌握 synchronized、volatile 和原子类的适用场景,结合良好的设计原则,就能有效防止 Java 中的数据竞争。关键是根据实际需求选择合适的同步手段,既保证正确性,又兼顾性能。

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

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

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

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

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

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

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

DeepSeek

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

相关专题

更多
string转int
string转int

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

5259

2023.08.02

java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

2090

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

143

2025.11.30

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2428

2023.11.20

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2428

2023.11.20

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是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2665

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

3268

2025.08.29

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

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

60

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