在多线程编程中,确保数据的一致性和线程安全性是至关重要的。Java 提供了 java.util.concurrent.atomic 包来帮助开发者实现无锁、高性能的线程安全操作。其中,AtomicLong 是处理长整型(long)原子操作的核心类之一。
本教程将带你从零开始了解 Java原子长整型(AtomicLong),即使你是 Java 并发编程的新手,也能轻松掌握其基本用法和应用场景。
AtomicLong 是一个支持原子操作的长整型变量。所谓“原子操作”,是指该操作在执行过程中不会被其他线程打断,从而避免了竞态条件(race condition)和数据不一致的问题。
与使用 synchronized 关键字相比,AtomicLong 基于底层的 CAS(Compare-And-Swap)机制,性能更高,尤其适用于高并发场景。
创建一个 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
如果不给普通 long 加 synchronized 锁,结果很可能小于 1000,说明存在线程安全问题。
以下是一些典型的 Java并发编程 场景,适合使用 AtomicLong:
虽然 AtomicLong 性能优秀,但也有一些限制:
LongAdder(Java 8 引入)。AtomicLong 是实现 线程安全长整型 操作的强大工具。通过本教程,你已经掌握了它的基本用法、核心方法以及实际应用场景。对于希望提升 Java并发编程 能力的开发者来说,熟练使用 AtomicLong 是迈向高性能、高可靠系统的重要一步。
现在,你可以尝试在自己的项目中使用 AtomicLong 来替代传统的加锁方式,体验无锁编程的魅力!
本文由主机测评网于2025-12-07发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025124111.html