每日一面——谈谈你对Atomic原子类的理解

菜鸡每日一面系列打卡18

每天一道面试题目 

助力小伙伴轻松拿offer

坚持就是胜利,我们一起努力!

题目描述

谈谈你对Atomic原子类的理解。

题目分析

同之前几篇文章所讲述的一样,Atomic原子类也是Java并发编程家族中的重要一员。实际上,Atomic原子类是对上一篇所提及的CAS算法的应用,因此,面试官经常喜欢从Atomic原子类问起,逐步深入到对CAS算法的考查。

接下来,随菜鸡一起去看看吧。

题目解答

01

概述

和往常一样,在开始详述之前,需要对Atomic原子类有一个整体的认识。Atomic原子类的整体关系如下图所示。

如图所示,Atomic原子类可以粗略划分为四种类型:basicarrayreferenceupdater

  • 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关键字?感谢你参加这次面试

每日一面——谈谈你对synchronized关键字的理解

每日一面——什么是CAS算法?

学习 | 工作 | 分享

????长按关注“有理想的菜鸡

只有你想不到,没有你学不到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值