常见的Atomic类有哪些?

  • Post category:Java

针对你提出的问题“常见的Atomic类有哪些?”的完整使用攻略,我将给出以下解答:

1. Atomic类概述

在多线程编程中,为了保证多个线程对同一变量或对象的操作完成之后仍然保持数据一致性,通常采用锁、volatile或Atomic等机制来实现。其中,Atomic采用了一种乐观锁(CAS)的方式来保证在并发修改时,每个线程操作某个变量时都能够获取到该变量在内存中的最新值,并对它进行修改或计算,从而确保原子性操作执行完善为止。

在Java并发编程中,Java.util.concurrent.atomic提供了一系列的原子性操作类,包括以下常用类:

  • AtomicInteger / AtomicIntegerArray
  • AtomicLong / AtomicLongArray
  • AtomicBoolean
  • AtomicReference / AtomicReferenceArray

这些类都继承自Number类,其封装了Java中单线程递增和递减操作的方法,并且提供了线程安全的递增和递减功能,使用非常广泛。

2. Atomic操作方法

  • getAndSet(int newValue):设置新值,并返回原始值。
  • compareAndSet(int expect, int update):比较期望值和更新值是否相等,如果相等则更新并返回true,否则不更新并返回false。
  • getAndIncrement() / incrementAndGet():先获取再增加。
  • getAndDecrement() / decrementAndGet():先获取再减少。
  • addAndGet(int delta) / getAndAdd(int delta):以原子方式将给定的值添加到当前值,并返回更新后的值。
  • getAndSet(V newValue):以原子方式设置给定值,并返回之前的值。
  • compareAndSet(V expect,V update):如果当前引用等于expect,则以原子方式将此引用设置为update。

3. 示例代码

3.1 AtomicInteger示例

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerDemo {

    static AtomicInteger ai = new AtomicInteger(0); // 统计线程执行次数

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 100000; i++) {
                ai.incrementAndGet();
            }
        });
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 100000; i++) {
                ai.incrementAndGet();
            }
        });

        t1.start();
        t2.start();
        t1.join();
        t2.join(); // 等待子线程执行完毕

        System.out.println(ai.get()); // 打印执行结果
    }

}

3.2 AtomicBoolean示例

import java.util.concurrent.atomic.AtomicBoolean;

public class AtomicBooleanDemo {

    static AtomicBoolean flag = new AtomicBoolean(false); // 初始默认未进入方法体

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            while (true) {
                if (flag.compareAndSet(false, true)) { // 修改flag为true
                    System.out.println("线程1:进入方法体执行");
                    break;
                } else {
                    System.out.println("线程1:重试获取锁");
                }
            }
        });

        Thread t2 = new Thread(() -> {
            while (true) {
                if (flag.compareAndSet(false, true)) { // 修改flag为true
                    System.out.println("线程2:进入方法体执行");
                    break;
                } else {
                    System.out.println("线程2:重试获取锁");
                }
            }
        });

        t1.start();
        t2.start();

        t1.join();
        t2.join(); // 等待线程执行完毕

        System.out.println("flag:" + flag); // 打印执行结果
    }

}

以上示例仅供参考。由于Atomic类是一个非常重要的Java并发编程知识点,需要多实践、多掌握。