每日一面——谈谈你对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(通过volatileCAS算法实现原子操作,存在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算法?

学习 | 工作 | 分享

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

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

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读