Java并发面试题, 你使用过 Java 中的哪些原子类?
Java并发面试题, 你使用过 Java 中的哪些原子类?
QA
Step 1
Q:: 你使用过 Java 中的哪些原子类?
A:: Java 中的原子类主要位于 java.util.concurrent.
atomic 包中,包括 AtomicInteger、AtomicLong、AtomicBoolean、AtomicReference 等。这些类提供了一种在并发环境下进行线程安全操作的方式,通过原子操作来保证数据的一致性。
Step 2
Q:: 什么是 CAS 操作,Java 中如何实现?
A:: CAS(Compare And Swap)是一种硬件支持的原子操作,用于实现无锁并发。在 Java 中,CAS 由 sun.misc.
Unsafe 类提供,通过比较内存中的值与预期值,如果相等则替换为新值。AtomicInteger、AtomicReference 等原子类的实现依赖于 CAS 操作。
Step 3
Q:: 原子类和同步锁(synchronized)的区别是什么?
A:: 原子类通过 CAS 操作实现无锁并发,性能较高,适用于高并发场景;而同步锁通过阻塞线程实现互斥访问,性能较低,但适用于较少线程竞争的场景。使用原子类可以避免线程上下文切换带来的开销。
Step 4
Q:: 你如何在 Java 中实现一个线程安全的计数器?
A:: 可以使用 AtomicInteger 类来实现线程安全的计数器。AtomicInteger 提供了原子性的递增和递减操作,例如 incrementAndGet() 和 decrementAndGet()
,保证了并发环境下计数器的正确性。
Step 5
Q:: 什么是原子引用类型?如何使用它们?
A:: 原子引用类型(如 AtomicReference)用于在并发环境下安全地操作引用类型变量。它们提供了类似于基本原子类型的操作,例如 compareAndSet()、getAndSet()
等,可以在无锁的情况下安全地更新引用。
Step 6
Q:: 原子类在并发编程中有哪些常见的应用场景?
A:: 原子类常用于实现计数器、状态标志、非阻塞算法等。例如,在高并发的计数场景中使用 AtomicInteger,在 CAS 操作中使用 AtomicReference 来实现无锁数据结构,如无锁队列。