当前位置:首页 > Java > 正文

Java原子长整型详解(AtomicLong入门与实战指南)

在多线程编程中,确保数据的一致性和线程安全性是至关重要的。Java 提供了 java.util.concurrent.atomic 包来帮助开发者实现无锁、高性能的线程安全操作。其中,AtomicLong 是处理长整型(long)原子操作的核心类之一。

本教程将带你从零开始了解 Java原子长整型(AtomicLong),即使你是 Java 并发编程的新手,也能轻松掌握其基本用法和应用场景。

什么是 AtomicLong?

AtomicLong 是一个支持原子操作的长整型变量。所谓“原子操作”,是指该操作在执行过程中不会被其他线程打断,从而避免了竞态条件(race condition)和数据不一致的问题。

与使用 synchronized 关键字相比,AtomicLong 基于底层的 CAS(Compare-And-Swap)机制,性能更高,尤其适用于高并发场景。

Java原子长整型详解(AtomicLong入门与实战指南) Java原子长整型 AtomicLong教程 Java并发编程 线程安全长整型 第1张

如何创建和使用 AtomicLong?

创建一个 AtomicLong 非常简单:

// 创建初始值为 0 的 AtomicLongAtomicLong counter = new AtomicLong();// 创建初始值为 100 的 AtomicLongAtomicLong balance = new AtomicLong(100L);

常用方法介绍

以下是 AtomicLong 的几个核心方法:

  • get():获取当前值。
  • set(long newValue):设置新值(非原子性赋值,但写入是可见的)。
  • getAndIncrement():先返回当前值,再自增 1。
  • incrementAndGet():先自增 1,再返回新值。
  • compareAndSet(long expect, long update):如果当前值等于期望值,则更新为新值,并返回 true;否则返回 false。

实战示例:多线程计数器

下面是一个使用 AtomicLong 实现线程安全计数器的例子,对比普通 long 变量在多线程下的问题:

import java.util.concurrent.atomic.AtomicLong;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class AtomicLongExample {    public static void main(String[] args) throws InterruptedException {        // 使用 AtomicLong        AtomicLong atomicCounter = new AtomicLong(0);                // 普通 long(非线程安全)        long[] normalCounter = {0};                ExecutorService executor = Executors.newFixedThreadPool(10);                // 启动 1000 个线程对计数器加 1        for (int i = 0; i < 1000; i++) {            executor.submit(() -> {                atomicCounter.incrementAndGet();      // 安全                synchronized (normalCounter) {        // 必须加锁才安全                    normalCounter[0]++;                }            });        }                executor.shutdown();        while (!executor.isTerminated()) {}                System.out.println("AtomicLong 结果: " + atomicCounter.get());        System.out.println("普通 long 结果(加锁后): " + normalCounter[0]);    }}

运行结果通常为:

AtomicLong 结果: 1000普通 long 结果(加锁后): 1000

如果不给普通 longsynchronized 锁,结果很可能小于 1000,说明存在线程安全问题。

AtomicLong 的适用场景

以下是一些典型的 Java并发编程 场景,适合使用 AtomicLong

  • 全局唯一 ID 生成器
  • 统计请求次数、访问量等指标
  • 实现无锁队列或计数器
  • 高性能日志编号系统

注意事项

虽然 AtomicLong 性能优秀,但也有一些限制:

  • 它只保证单个变量的原子性,不能用于复合操作(如“先读再写”多个步骤)。
  • 在极高并发下(如大量线程频繁竞争),CAS 可能导致“ABA 问题”或性能下降,此时可考虑使用 LongAdder(Java 8 引入)。

总结

AtomicLong 是实现 线程安全长整型 操作的强大工具。通过本教程,你已经掌握了它的基本用法、核心方法以及实际应用场景。对于希望提升 Java并发编程 能力的开发者来说,熟练使用 AtomicLong 是迈向高性能、高可靠系统的重要一步。

现在,你可以尝试在自己的项目中使用 AtomicLong 来替代传统的加锁方式,体验无锁编程的魅力!