Java 语言 AtomicInteger实现无锁计数的示例

Java阿木 发布于 2025-06-25 12 次阅读


摘要:

在多线程编程中,无锁编程是一种避免使用锁机制,通过原子操作来保证数据一致性和线程安全的方法。本文将围绕Java中的AtomicInteger类,探讨其实现无锁计数的原理,并通过示例代码展示如何使用AtomicInteger进行线程安全的计数操作。

一、

在多线程环境中,对共享资源的访问需要保证线程安全。传统的同步机制,如synchronized关键字,虽然简单易用,但在高并发场景下可能会造成性能瓶颈。而原子类(Atomic类)提供了无锁编程的解决方案,其中AtomicInteger是原子整数类,用于实现线程安全的计数操作。

二、AtomicInteger原理

AtomicInteger内部维护了一个volatile类型的变量value,用于存储计数器的值。volatile关键字确保了多线程之间的可见性和有序性,即当一个线程修改了共享变量后,其他线程能够立即看到这个修改。

AtomicInteger内部使用CAS(Compare-And-Swap)操作来实现无锁计数。CAS操作是一种原子操作,它包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相等,就将内存位置的值修改为新值。否则,不做任何操作。

三、AtomicInteger常用方法

1. incrementAndGet():原子性地将计数器的值增加1,并返回增加后的值。

2. getAndIncrement():原子性地将计数器的值增加1,并返回增加前的值。

3. decrementAndGet():原子性地将计数器的值减少1,并返回减少后的值。

4. getAndDecrement():原子性地将计数器的值减少1,并返回减少前的值。

四、示例代码

以下是一个使用AtomicInteger进行无锁计数的示例:

java

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerExample {


private static AtomicInteger count = new AtomicInteger(0);

public static void main(String[] args) {


// 创建10个线程,每个线程增加计数器


for (int i = 0; i < 10; i++) {


new Thread(() -> {


for (int j = 0; j < 1000; j++) {


count.incrementAndGet();


}


}).start();


}

// 等待所有线程执行完毕


while (Thread.activeCount() > 1) {


Thread.yield();


}

// 输出最终计数结果


System.out.println("Final count: " + count.get());


}


}


在上述代码中,我们创建了10个线程,每个线程执行1000次自增操作。由于AtomicInteger保证了原子性,最终计数结果应该是10000。

五、总结

本文介绍了Java中的AtomicInteger类及其实现无锁计数的原理。通过示例代码展示了如何使用AtomicInteger进行线程安全的计数操作。在实际开发中,我们可以根据需求选择合适的原子类,以实现高效的线程安全编程。

六、扩展阅读

1. 《Java并发编程实战》

2. 《深入理解Java虚拟机》

3. 《Java并发编程之美》

通过学习这些资料,可以更深入地了解Java并发编程的相关知识,提高编程技能。