面试题:你使用过 Java 中的哪些原子类?

Java 中的 原子类(Atomic Classes) 是 java.util.concurrent.atomic 包中提供的一组线程安全的类,用于在多线程环境下实现无锁的原子操作。这些类通过 CAS(Compare-And-Swap)操作来保证线程安全,避免了使用锁带来的性能开销。以下是 Java 中常见的原子类及其用途:


1. 基本类型原子类

  • AtomicInteger
    • 用于对 int 类型进行原子操作。
    • 常用方法:get()set()getAndSet()compareAndSet()incrementAndGet()decrementAndGet() 等。
  • AtomicLong
    • 用于对 long 类型进行原子操作。
    • 常用方法与 AtomicInteger 类似。
  • AtomicBoolean
    • 用于对 boolean 类型进行原子操作。
    • 常用方法:get()set()compareAndSet() 等。

2. 引用类型原子类

  • AtomicReference<V>
    • 用于对引用类型进行原子操作。
    • 常用方法:get()set()compareAndSet() 等。
  • AtomicStampedReference<V>
    • 在 AtomicReference 的基础上增加了版本号(Stamp),用于解决 ABA 问题。
    • 常用方法:getReference()getStamp()compareAndSet() 等。
    • 示例代码
      AtomicStampedReference<String> atomicStampedRef = new AtomicStampedReference<>("Initial Value", 0);
      int[] stampHolder = new int[1];
      String value = atomicStampedRef.get(stampHolder); // 获取值和版本号
      atomicStampedRef.compareAndSet(value, "New Value", stampHolder[0], stampHolder[0] + 1); // 原子更新
      System.out.println(atomicStampedRef.getReference()); // 输出 "New Value"
  • AtomicMarkableReference<V>
    • 在 AtomicReference 的基础上增加了一个布尔标记(Mark),用于解决 ABA 问题。
    • 常用方法:getReference()isMarked()compareAndSet() 等。
    • 示例代码
      AtomicMarkableReference<String> atomicMarkableRef = new AtomicMarkableReference<>("Initial Value", false);
      boolean[] markHolder = new boolean[1];
      String value = atomicMarkableRef.get(markHolder); // 获取值和标记
      atomicMarkableRef.compareAndSet(value, "New Value", markHolder[0], true); // 原子更新
      System.out.println(atomicMarkableRef.getReference()); // 输出 "New Value"

3. 数组类型原子类

  • AtomicIntegerArray
    • 用于对 int 数组进行原子操作。
    • 常用方法:get()set()compareAndSet() 等。
  • AtomicLongArray
    • 用于对 long 数组进行原子操作。
    • 常用方法与 AtomicIntegerArray 类似。
  • AtomicReferenceArray<E>
    • 用于对引用类型数组进行原子操作。
    • 常用方法:get()set()compareAndSet() 等。

4. 字段更新器

  • AtomicIntegerFieldUpdater<T>
    • 用于对类的 volatile int 字段进行原子更新。
    • 常用方法:get()set()compareAndSet() 等。
    • 示例代码
      class Counter {
          volatile int count;
      }
      
      Counter counter = new Counter();
      AtomicIntegerFieldUpdater<Counter> updater = AtomicIntegerFieldUpdater.newUpdater(Counter.class, "count");
      updater.incrementAndGet(counter); // 原子递增
      System.out.println(counter.count); // 输出 1
  • AtomicLongFieldUpdater<T>
    • 用于对类的 volatile long 字段进行原子更新。
    • 常用方法与 AtomicIntegerFieldUpdater 类似。
    • 示例代码
      class Counter {
          volatile long count;
      }
      
      Counter counter = new Counter();
      AtomicLongFieldUpdater<Counter> updater = AtomicLongFieldUpdater.newUpdater(Counter.class, "count");
      updater.addAndGet(counter, 10); // 原子增加
      System.out.println(counter.count); // 输出 10
  • AtomicReferenceFieldUpdater<T, V>
    • 用于对类的 volatile 引用字段进行原子更新。
    • 常用方法:get()set()compareAndSet() 等。
    • 示例代码
      class Container {
          volatile String value;
      }
      
      Container container = new Container();
      AtomicReferenceFieldUpdater<Container, String> updater = AtomicReferenceFieldUpdater.newUpdater(Container.class, String.class, "value");
      updater.compareAndSet(container, null, "New Value"); // 原子更新
      System.out.println(container.value); // 输出 "New Value"

5. 总结

  • 基本类型原子类AtomicIntegerAtomicLongAtomicBoolean,用于对基本类型进行原子操作。
  • 引用类型原子类AtomicReferenceAtomicStampedReferenceAtomicMarkableReference,用于对引用类型进行原子操作,并解决 ABA 问题。
  • 数组类型原子类AtomicIntegerArrayAtomicLongArrayAtomicReferenceArray,用于对数组进行原子操作。
  • 字段更新器AtomicIntegerFieldUpdaterAtomicLongFieldUpdaterAtomicReferenceFieldUpdater,用于对类的字段进行原子更新。

这些原子类通过 CAS 操作实现了高效的无锁并发控制,适合在高并发场景下使用。

THE END
点赞12 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容