AtomicInteger通过CAS实现无锁原子操作,解决多线程下i++等非原子操作导致的竞态条件问题,相比synchronized避免了阻塞和上下文切换开销,在低竞争场景下性能更优。

Java中的
AtomicInteger
synchronized
在多线程编程中,我们经常需要对一个共享的计数器或状态变量进行操作。如果直接使用
int
count++
AtomicInteger
它的核心机制是基于CAS(Compare-And-Swap,比较并交换)指令,这是一种CPU级别的原子操作。当你尝试更新
AtomicInteger
synchronized
ReentrantLock
以下是一些
AtomicInteger
立即学习“Java免费学习笔记(深入)”;
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicIntegerDemo {
    // 创建一个初始值为0的AtomicInteger
    private static AtomicInteger counter = new AtomicInteger(0);
    public static void main(String[] args) throws InterruptedException {
        // 示例1: 递增操作
        System.out.println("初始值: " + counter.get()); // 0
        // incrementAndGet():先递增,再返回新值
        int newValue1 = counter.incrementAndGet();
        System.out.println("递增后 (incrementAndGet): " + newValue1 + ", 当前值: " + counter.get()); // 1, 1
        // getAndIncrement():先返回旧值,再递增
        int oldValue1 = counter.getAndIncrement();
        System.out.println("递增后 (getAndIncrement): " + oldValue1 + ", 当前值: " + counter.get()); // 1, 2
        // 示例2: 递减操作
        // decrementAndGet():先递减,再返回新值
        int newValue2 = counter.decrementAndGet();
        System.out.println("递减后 (decrementAndGet): " + newValue2 + ", 当前值: " + counter.get()); // 1, 1
        // getAndDecrement():先返回旧值,再递减
        int oldValue2 = counter.getAndDecrement();
        System.out.println("递减后 (getAndDecrement): " + oldValue2 + ", 当前值: " + counter.get()); // 1, 0
        // 示例3: 加法操作
        // addAndGet(delta):将delta加到当前值上,并返回新值
        int newValue3 = counter.addAndGet(5);
        System.out.println("加5后 (addAndGet): " + newValue3 + ", 当前值: " + counter.get()); // 5, 5
        // getAndAdd(delta):返回旧值,然后将delta加到当前值上
        int oldValue3 = counter.getAndAdd(3);
        System.out.println("加3后 (getAndAdd): " + oldValue3 + ", 当前值: " + counter.get()); // 5, 8
        // 示例4: 比较并设置 (CAS)
        // compareAndSet(expectedValue, updateValue):如果当前值等于expectedValue,则更新为updateValue并返回true;否则返回false
        boolean casSuccess1 = counter.compareAndSet(8, 10); // 当前是8,期望也是8,更新为10
        System.out.println("CAS操作 (8 -> 10) 成功? " + casSuccess1 + ", 当前值: " + counter.get()); // true, 10
        boolean casSuccess2 = counter.compareAndSet(8, 12); // 当前是10,期望是8,不匹配,不更新
        System.out.println("CAS操作 (8 -> 12) 成功? " + casSuccess2 + ", 当前值: " + counter.get()); // false, 10
        // 示例5: 多线程计数器
        AtomicInteger multiThreadCounter = new AtomicInteger(0);
        int numThreads = 10;
        int incrementsPerThread = 1000;
        Thread[] threads = new Thread[numThreads];
        for (int i = 0; i < numThreads; i++) {
            threads[i] = new Thread(() -> {
                for (int j = 0; j < incrementsPerThread; j++) {
                    multiThreadCounter.incrementAndGet();
                }
            });
            threads[i].start();
        }
        for (Thread t : threads) {
            t.join(); // 等待所有线程完成
        }
        System.out.println("多线程计数器最终值: " + multiThreadCounter.get()); // 应该总是 numThreads * incrementsPerThread = 10000
    }
}int
AtomicInteger
你可能觉得,不就是个整数加减吗,有什么难的?但当多个线程同时访问并修改一个
int
i++
i
i
i
i
i
i
传统的解决方案是使用
synchronized
ReentrantLock
AtomicInteger
AtomicInteger
incrementAndGet()
AtomicInteger
AtomicInteger
get()
set(int newValue)
get()
set()
newValue
incrementAndGet()
getAndIncrement()
incrementAndGet()
getAndIncrement()
decrementAndGet()
getAndDecrement()
decrementAndGet()
getAndDecrement()
addAndGet(int delta)
getAndAdd(int delta)
delta
addAndGet(delta)
delta
getAndAdd(delta)
delta
compareAndSet(int expectedValue, int updateValue)
AtomicInteger
updateValue
expectedValue
true
false
weakCompareAndSet(int expectedValue, int updateValue)
compareAndSet
compareAndSet
AtomicInteger
synchronized
ReentrantLock
AtomicInteger
synchronized
ReentrantLock
AtomicInteger
AtomicInteger
synchronized
ReentrantLock
然而,
AtomicInteger
何时选择AtomicInteger
AtomicBoolean
AtomicInteger
AtomicInteger
AtomicInteger
AtomicInteger
何时选择synchronized
ReentrantLock
AtomicInteger
AtomicInteger
ReentrantLock
ReentrantLock
Condition
AtomicInteger
总而言之,
AtomicInteger
以上就是Java中AtomicInteger原子类使用方法的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号