Java并发中的原子类详细代码实例

 更新时间:2026年05月25日 09:58:00   作者:014-code  
Java中提供了一些原子类,原子类包装了一个变量,并且提供了一系列对变量进行原子性操作的方法,这篇文章主要介绍了Java并发中原子类的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

1. 为什么需要原子类

多线程环境下,有个常见问题:

public class Counter {
    private int count = 0;

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

count++ 看似一行代码,实际分三步:

  1. 读取 count 的值
  2. 加 1
  3. 写回 count

多线程下可能发生:

线程A:读取 count=0
线程B:读取 count=0
线程A:count=1,写回
线程B:count=1,写回   // 线程A的结果被覆盖了

最终 count=1,但实际应该等于 2。

2. 解决办法

synchronized 加锁

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

缺点:性能差,每次只能一个线程进入。

原子类

private AtomicInteger count = new AtomicInteger(0);

public void increment() {
    count.incrementAndGet();
}

一行搞定,性能比 synchronized 高很多。

3. 常用原子类

AtomicInteger

AtomicInteger count = new AtomicInteger(0);

// 加1
count.incrementAndGet();  // ++i
count.getAndIncrement();  // i++

// 减1
count.decrementAndGet();  // --i
count.getAndDecrement();  // i--

// 加任意值
count.addAndGet(5);

// 获取值
int value = count.get();

// 设置值
count.set(100);

// CAS 操作
count.compareAndSet(100, 200);  // 如果当前值是100,则设置为200

AtomicLong

和 AtomicInteger 用法一样,只是类型不同:

AtomicLong count = new AtomicLong(0);
count.incrementAndGet();

AtomicBoolean

AtomicBoolean flag = new AtomicBoolean(false);

// 设为 true
flag.set(true);

// CAS 操作
flag.compareAndSet(false, true);

AtomicReference

用来原子更新对象:

AtomicReference<User> userRef = new AtomicReference<>();

User user1 = new User("张三", 20);
User user2 = new User("李四", 25);

userRef.set(user1);
userRef.compareAndSet(user1, user2);  // 如果当前是 user1,则改为 user2

4. 数组原子类

// 数组中某个元素原子操作
AtomicIntegerArray arr = new AtomicIntegerArray(new int[]{1, 2, 3});

arr.getAndAdd(0, 10);  // 第一个元素加10
int value = arr.get(0);  // 获取第一个元素

5. 累加器

jdk8 新增的,比 AtomicInteger 性能更高,专门用于累加场景:

LongAdder count = new LongAdder();

count.add(1);
count.increment();
long value = count.sum();

内部原理是把一个值拆成多个 Cell,减少竞争。适合高并发场景下的累加。

// AtomicInteger vs LongAdder
// 低并发:两者差不多
// 高并发:LongAdder 性能更好

6. 实战示例

计数器

public class PageViewCounter {
    private AtomicInteger count = new AtomicInteger(0);

    public void addView() {
        count.incrementAndGet();
    }

    public int getViews() {
        return count.get();
    }
}

防止重复提交

public class SubmitService {
    private AtomicBoolean submitting = new AtomicBoolean(false);

    public void submit() {
        // 如果已经在提交中,直接返回
        if (!submitting.compareAndSet(false, true)) {
            return;
        }

        try {
            // 业务逻辑
            doSubmit();
        } finally {
            submitting.set(false);
        }
    }
}

配置更新

public class ConfigHolder {
    private AtomicReference<Config> configRef = new AtomicReference<>();

    public void updateConfig(Config newConfig) {
        configRef.updateAndGet(old -> newConfig);
    }

    public Config getConfig() {
        return configRef.get();
    }
}

7. 总结

用途
AtomicInteger整数原子操作
AtomicLong长整数原子操作
AtomicBoolean布尔原子操作
AtomicReference对象引用原子操作
AtomicIntegerArray整数数组原子操作
LongAdder高并发累加,比 AtomicLong 性能更好

什么时候用

  • 需要保证多线程安全地修改一个值时
  • 简单计数、状态标记等场景
  • 比 synchronized 性能更好

到此这篇关于Java并发中原子类的文章就介绍到这了,更多相关Java并发原子类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • RestTemplate的URL请求示例

    RestTemplate的URL请求示例

    这篇文章主要为大家介绍了RestTemplate的URL请求示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • java实现小i机器人api接口调用示例

    java实现小i机器人api接口调用示例

    这篇文章主要介绍了java实现小i机器人api接口调用示例,需要的朋友可以参考下
    2014-04-04
  • Java zxing生成条形码和二维吗代码实例

    Java zxing生成条形码和二维吗代码实例

    这篇文章主要介绍了java zxing生成条形码和二维吗代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 一个开发者对 Spring Security 拦截机制的深度追问(最新推荐)

    一个开发者对 Spring Security 拦截机制的深度追问(最新推荐)

    作者通过一次调试经历,深入探讨了SpringSecurity的拦截机制,揭示了Filter与AOP在安全控制中的不同职,责,并分享了调试和理解框架的技巧,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • Java实现导入导出Excel文件的方法(poi,jxl)

    Java实现导入导出Excel文件的方法(poi,jxl)

    这篇文章主要介绍了Java实现导入导出Excel文件的方法(poi,jxl),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Spring Boot Pf4j模块化开发方案设计过程解析

    Spring Boot Pf4j模块化开发方案设计过程解析

    本文介绍了基于SpringPf4j实现Java版本模块化开发的设计方案,包括插件化基础设施的二次封装、Spring控制器动态注册、SpringDoc-OpenApi集成等,通过这些步骤,实现插件的动态加载和Swagger接口的动态展示,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • 浅谈Java多进程程序的运行模式

    浅谈Java多进程程序的运行模式

    这篇文章主要介绍了浅谈Java多进程程序的运行模式,包括对进程阻塞问题的讨论等,需要的朋友可以参考下
    2015-11-11
  • Java由浅入深刨析继承

    Java由浅入深刨析继承

    继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为
    2022-03-03
  • Spring事务管理只对出现运行期异常进行回滚

    Spring事务管理只对出现运行期异常进行回滚

    Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚,需要了解更多Spring事务方面的知识,可详看本文
    2012-11-11
  • springboot使用dubbo和zookeeper代码实例

    springboot使用dubbo和zookeeper代码实例

    这篇文章主要介绍了springboot使用dubbo和zookeeper代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论