JUC小册——Atomic原子变量操作类原理与用法总结

目录

一、Atomic原子变量操作类简介

二、原子变量操作类

三、使用场景

1. 计数器

2. 状态标志

3. 共享资源的引用

4. 实现无锁算法

四、代码示例


一、Atomic原子变量操作类简介

在 Java 中, java.util.concurrent.atomic 包提供了一系列原子变量操作类,这些类能够在多线程环境中安全地执行操作,而无需使用显式的同步机制。原子变量操作类通过底层的硬件支持CAS 来确保操作的原子性。

二、原子变量操作类

以下是 JUC 下的一些常用原子变量操作类:

1.  AtomicBoolean :提供对 boolean 值的原子操作。

2. AtomicInteger :提供对 int 值的原子操作。

3. AtomicLong :提供对 long 值的原子操作。

4. AtomicReference<V> :提供对对象引用的原子操作。

5. AtomicIntegerArray :提供对 int 数组的原子操作。

6. AtomicLongArray :提供对 long 数组的原子操作。

7.  AtomicReferenceArray<E> :提供对对象数组的原子操作。

8. AtomicMarkableReference<V> :提供对对象引用及其标记的原子操作。

9. AtomicStampedReference<V> :提供对对象引用及其版本戳的原子操作。

三、使用场景

1. 计数器

在多线程环境中,需要对某个计数器进行原子递增或递减操作。

2. 状态标志

在多线程中需要安全地设置和获取状态标志。

3. 共享资源的引用

在多线程环境中安全地更新共享对象的引用。

4. 实现无锁算法

使用原子操作可以实现一些复杂的数据结构,如无锁栈、无锁队列等。

四、代码示例

下面使用 AtomicInteger演示如何在多线程环境中安全地递增计数器:

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerExample {
    private static AtomicInteger counter = new AtomicInteger(0);

    public static void main(String[] args) {
        // 创建多个线程
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.incrementAndGet(); // 原子递增
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.incrementAndGet(); // 原子递增
            }
        });

        // 启动线程
        thread1.start();
        thread2.start();

        // 等待线程结束
        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 输出最终计数器的值
        System.out.println("counter value: " + counter.get());
    }
}

运行结果:

可以看到,两个线程并发地对 counter 进行递增操作。由于使用了 AtomicInteger ,可以确保最终计数器的值是 2000(即两个线程各自递增 1000 次),而不会出现线程安全问题。

其他Atomic原子变量操作类用法类似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值