菜鸡每日一面系列打卡18天
每天一道面试题目
助力小伙伴轻松拿offer
坚持就是胜利,我们一起努力!
题目描述
谈谈你对Atomic原子类的理解。
题目分析
同之前几篇文章所讲述的一样,Atomic原子类也是Java并发编程家族中的重要一员。实际上,Atomic原子类是对上一篇所提及的CAS算法的应用,因此,面试官经常喜欢从Atomic原子类问起,逐步深入到对CAS算法的考查。
接下来,随菜鸡一起去看看吧。
题目解答
01
概述
和往常一样,在开始详述之前,需要对Atomic原子类有一个整体的认识。Atomic原子类的整体关系如下图所示。
如图所示,Atomic原子类可以粗略划分为四种类型:basic,array,reference,updater。
basic:基本类型原子类。该类型包括:
AtomicInteger(整型原子类)
AtomicLong(长整型原子类)
AtomicBoolean(布尔型原子类)
array:数组类型原子类。该类型包括:
AtomicIntegerArray(整型数组原子类)
AtomicLongArray(长整型数组原子类)
AtomicReferenceArray(引用类型数组原子类)
reference:引用类型原子类。该类型包括:
AtomicReference(通过volatile和CAS算法实现原子操作,存在ABA问题)
AtomicMarkableReference(通过Pair对象的boolean标记解决ABA问题)
AtomicStampedReference(通过Pair对象的int标记解决ABA问题,可记录改动次数)
updater:更新器原子类。该类型包括:
AtomicIntegerFieldUpdater(整型字段更新器原子类)
AtomicLongFieldUpdater(长整型字段更新器原子类)
AtomicReferenceFieldUpdater(引用类型更新器原子类)
02
源码分析
接下来,我们以AtomicInteger为例,通过分析源代码,探究其底层原理。
package java.util.concurrent.atomic;
import java.util.function.IntUnaryOperator;
import java.util.function.IntBinaryOperator;
import sun.misc.Unsafe;
public class AtomicInteger extends Number implements java.io.Serializable {
private static final long serialVersionUID = 6214790243416807050L;
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset;
static {
try {
valueOffset = unsafe.objectFieldOffset
(AtomicInteger.class.getDeclaredField("value"));
} catch (Exception ex) { throw new Error(ex); }
}
private volatile int value;
......
}
AtomicInteger原子类主要利用volatile变量和CAS算法来保证原子操作,在读多写少的场景下,避免使用synchronized关键字带来的线程阻塞与切换的高开销,从而提升效率。这一句话,涉及到了之前写的三篇文章的重点知识,不清楚的小伙伴请戳文末相关链接进行学习。
03
示例
接下来,让我们写一个简单的demo来演示一下AtomicInteger原子类的使用。
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicIntegerTest {
public static void main(String[] args) {
// 创建一个整型原子类的实例,并初始化为0
AtomicInteger number = new AtomicInteger(0);
// 线程安全的自增操作
number.incrementAndGet();
// 线程安全的加法操作
number.addAndGet(5);
// 线程安全的懒更新操作
number.lazySet(10);
}
}
以上便是菜鸡对Atomic类的一些总结,供大家参考。
相关链接
每日一面——没用过volatile关键字?感谢你参加这次面试
学习 | 工作 | 分享
????长按关注“有理想的菜鸡”
只有你想不到,没有你学不到