Java并发面试题, 什么是 Java 中的 ABA 问题?
Java并发面试题, 什么是 Java 中的 ABA 问题?
QA
Step 1
Q:: 什么是 Java 中的 ABA 问题?
A:: ABA 问题是指在使用 CAS (Compare-And-Swap)
算法进行并发操作时,无法检测到变量值发生了变化的问题。具体来说,如果一个变量的值从 A 变为 B,然后又变回 A,CAS 操作会认为值没有变化,从而导致问题。ABA 问题通常在实现无锁数据结构时出现,可以通过增加版本号(如 AtomicStampedReference 或 AtomicMarkableReference)来解决。
Step 2
Q:: 什么是 CAS 操作?
A:: CAS (Compare-And-Swap)
是一种原子操作,用于实现无锁数据结构。CAS 操作包含三个参数:内存位置、预期值和新值。只有当内存位置的值等于预期值时,CAS 才会将该位置的值修改为新值。否则,它什么都不做。CAS 操作是实现并发控制的重要手段,广泛应用于 Java 的并发包中。
Step 3
Q:: Java 中的原子类有哪些?
A:: Java 并发包 (java.util.concurrent.atomic)
提供了一系列原子类,用于支持原子操作,常见的原子类包括:AtomicInteger、AtomicLong、AtomicBoolean、AtomicReference 等。这些原子类通过 CAS 操作实现线程安全的操作,避免了传统的锁机制。
Step 4
Q:: Java 中的 ReentrantLock 是什么?
A:: ReentrantLock 是 Java 并发包提供的一种可重入锁,允许线程反复进入已经由它持有的锁。与 synchronized 不同,ReentrantLock 提供了更多的灵活性,例如可以尝试获取锁、超时获取锁以及中断获取锁等功能。ReentrantLock 还支持公平锁和非公平锁的选择。
Step 5
Q:: 什么是 Java 中的 volatile 关键字?
A:: volatile 关键字用于声明变量时,保证对该变量的修改会立即被写入主内存,并且每次读取该变量时,都会从主内存中读取最新的值。volatile 适用于某些需要轻量级同步的场景,但它无法保证复合操作(如自增)的原子性。