Java多线程——原子操作(原子操作的基本概念、常见实现类的特点、相关关键字的区别等)-面试题+答案——第11期
原子操作是在多线程编程中用于确保线程安全的基本操作,通常是不可中断的操作。
-
什么是原子操作?
- 答案:
- 原子操作是不可中断的操作,要么全部执行成功,要么全部不执行,没有中间状态。
- 答案:
-
Java中有哪些原子操作的实现?
- 答案:
- Java中的
java.util.concurrent.atomic
包提供了一系列原子操作的实现,如AtomicInteger
、AtomicLong
、AtomicReference
等。
- Java中的
- 答案:
-
AtomicInteger
和普通的int
有什么区别?- 答案:
AtomicInteger
提供了原子性的增减操作,保证了这些操作是不可中断的。- 普通的
int
在多线程环境中可能会发生竞态条件,需要使用锁来确保线程安全。
- 答案:
-
CAS(Compare and Swap)是什么?
- 答案:
- CAS是一种原子操作,用于比较并交换内存中的值。它是一种无锁算法,用于实现线程安全的操作。
- 答案:
-
什么是ABA问题?
AtomicStampedReference
是如何解决的?- 答案:
- ABA问题是指一个值在操作过程中先后变为A、B、再变为A,但无法察觉中间的B的变化。
AtomicStampedReference
使用版本号来解决ABA问题,每次更新时需要传入一个版本号,只有版本号相同时才更新。
- 答案:
-
volatile
关键字和原子操作有什么关系?- 答案:
volatile
关键字提供了可见性,保证一个线程对共享变量的修改对其他线程是可见的。- 但是,它不提供原子性,复合操作仍然可能发生竞态条件。原子操作通常需要使用
Atomic
类来确保线程安全。
- 答案:
-
AtomicReference
和volatile
有什么区别?- 答案:
AtomicReference
是java.util.concurrent.atomic
包提供的原子引用类型,可以进行原子性的更新操作。volatile
关键字只能保证可见性,不能保证原子性。
- 答案:
-
AtomicLong
和LongAdder
有什么区别?- 答案:
AtomicLong
是java.util.concurrent.atomic
包中的类,提供了原子性的增减操作。LongAdder
也是用于对long类型进行原子操作的类,相比于AtomicLong
在高并发情况下性能更好。
- 答案:
-
什么是原子性、一致性、可见性?
- 答案:
- 原子性是指一个操作是不可中断的,要么全部执行成功,要么全部不执行。
- 一致性是指操作的结果必须是系统处于某个合法状态。
- 可见性是指一个线程对共享变量的修改对其他线程是可见的。
- 答案:
-
LongAdder
为什么在高并发情况下比AtomicLong
性能更好?- 答案:
LongAdder
在高并发情况下采用了分段的累加器,减小了竞争,提高了性能。- 相比于
AtomicLong
,LongAdder
的性能更好,但在低并发情况下可能略逊一筹。
- 答案:
这些问题涵盖了原子操作的基本概念、常见实现类的特点、相关关键字的区别等方面。在回答这些问题时,确保理解每个概念,并能够通过实际的例子说明你的理解。