java源码-AtomicBoolean

简介: 开篇 AtomicBoolean位于java.util.concurrent.atomic包下,是java提供给的可以保证数据的原子性操作的一个类。 Atomicxxxx系列主要核心在于Unsafe这个类的运用保证线程安全,而Unsafe这个类应该是通过JNI调用的底层实现。

开篇

 AtomicBoolean位于java.util.concurrent.atomic包下,是java提供给的可以保证数据的原子性操作的一个类。
 Atomicxxxx系列主要核心在于Unsafe这个类的运用保证线程安全,而Unsafe这个类应该是通过JNI调用的底层实现。
 关于java集合的源码阅读暂时告一段落,开始开启JUC包下相关的源码分析,欢迎关注。


AtomicBoolean类构造器

 AtomicBoolean的构造器分为有参和无参两种:

  • 参数为boolean initialValue的构造函数内部会将boolean转为int类型初始化value
  • 无参数的构造函数默认初始化value为0

 AtomicBoolean的关键逻辑在于static代码快中通过unsafe接口初始化value的内存地址,后续直接通过内存地址进行操作。

public class AtomicBoolean implements java.io.Serializable {
    private static final long serialVersionUID = 4654671469794556979L;
    // 设置为使用Unsafe进行原子更新
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    // 保存修改变量的实际内存地址,通过unsafe.objectFieldOffset读取
    private static final long valueOffset;

    // 初始化的时候计算出保存的value的内存地址便于直接进行内存操作
    static {
        try {
            valueOffset = unsafe.objectFieldOffset
                (AtomicBoolean.class.getDeclaredField("value"));
        } catch (Exception ex) { throw new Error(ex); }
    }

    private volatile int value;

    // 根据bool类型的入参initialValue初始化int类型的value
    public AtomicBoolean(boolean initialValue) {
        value = initialValue ? 1 : 0;
    }

    // int类型的value默认初始化为0
    public AtomicBoolean() {
    }
}


AtomicBoolean的get操作

 AtomicBoolean的get操作当中直接转化int类型的value为boolean对象进行返回。
 AtomicBoolean的getAndSet操作可以好好研究研究,首先get之前的值prev,然后通过compareAndSet进行设置。设置成功就返回之前的值,否则直到设置成功后才返回原来的值,有种乐观锁的概念
  compareAndSet函数内部是通过unsafe.compareAndSwapInt进行原子操作且必须期待着为expect的情况下才能设置为update。如果expect和实际存储的值不一致那么就一直循环更新。
  getAndSet的无法区分ABA的场景,也就是说原来是A的时候被其他线程更新为B后再由其他线程更新为A,这种它是区分不出来的。

    public final boolean get() {
        return value != 0;
    }

 
    public final boolean getAndSet(boolean newValue) {
        boolean prev;
        do {
            prev = get();
        } while (!compareAndSet(prev, newValue));
        return prev;
    }

    public final boolean compareAndSet(boolean expect, boolean update) {
        int e = expect ? 1 : 0;
        int u = update ? 1 : 0;
        return unsafe.compareAndSwapInt(this, valueOffset, e, u);
    }


AtomicBoolean的set操作

 AtomicBoolean的set相关操作中分为两大类:

  • set()直接覆盖value值
  • compareAndSet()、weakCompareAndSet()、lazySet()内部都是通过unsafe接口进行操作。
  • compareAndSet()和weakCompareAndSet()内部都是通过compareAndSwapInt进行交换保证满足expect后才能更新为update值
  • lazySet()方法通过unsafe的putOrderedInt进行保存,网上说法是这个新修改的值会有一定的延迟可见性的效果,没继续深究。
    public final boolean compareAndSet(boolean expect, boolean update) {
        int e = expect ? 1 : 0;
        int u = update ? 1 : 0;
        return unsafe.compareAndSwapInt(this, valueOffset, e, u);
    }

    
    public boolean weakCompareAndSet(boolean expect, boolean update) {
        int e = expect ? 1 : 0;
        int u = update ? 1 : 0;
        return unsafe.compareAndSwapInt(this, valueOffset, e, u);
    }

    
    public final void set(boolean newValue) {
        value = newValue ? 1 : 0;
    }

   
    public final void lazySet(boolean newValue) {
        int v = newValue ? 1 : 0;
        unsafe.putOrderedInt(this, valueOffset, v);
    }


参考文章

JAVA中神奇的双刃剑--Unsafe

目录
相关文章
|
2天前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
41 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
|
2天前
|
分布式计算 Java API
Java8 Lambda实现源码解析
Java8的lambda应该大家都比较熟悉了,本文主要从源码层面探讨一下lambda的设计和实现。
|
3天前
|
存储 Java
0基础java初学者都能做的打字通小游戏? 内含源码解读和细致讲解!!
0基础java初学者都能做的打字通小游戏? 内含源码解读和细致讲解!!
15 2
0基础java初学者都能做的打字通小游戏? 内含源码解读和细致讲解!!
|
3天前
|
SQL Java 分布式数据库
实现HBase表和RDB表的转化(附Java源码资源)
该文介绍了如何将数据从RDB转换为HBase表,主要涉及三个来源:RDB Table、Client API和Files。文章重点讲解了RDB到HBase的转换,通过批处理思想,利用RDB接口批量导出数据并转化为`List<Put>`,然后导入HBase。目录结构包括配置文件、RDB接口及实现类、HBase接口及实现类,以及一个通用转换器接口和实现。代码中,`RDBImpl`负责从RDB读取数据并构造`Put`对象,`HBaseImpl`则负责将`Put`写入HBase表。整个过程通过配置文件`transfer.properties`管理HBase和RDB的映射关系。
21 3
实现HBase表和RDB表的转化(附Java源码资源)
|
6天前
|
消息中间件 缓存 Java
java基于云部署的SaaS医院云HIS系统源码 心理CT、B超 lis、电子病历
云HIS系统是一款满足基层医院各类业务需要的健康云产品。该产品能帮助基层医院完成日常各类业务,提供病患预约挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生工作站和护士工作站等一系列常规功能,还能与公卫、PACS等各类外部系统融合,实现多层机构之间的融合管理。
41 12
|
9天前
|
人工智能 监控 Java
java互联网+智慧工地云平台SaaS源码
智慧工地以施工现场风险预知和联动预控为目标,将智能AI、传感技术、人像识别、监控、虚拟现实、物联网、5G、大数据、互联网等新一代科技信息技术植入到建筑、机械、人员穿戴设施、场地进出关口等各类设备中,实现工程管理与工程施工现场的整合
22 0
|
11天前
|
监控 Java BI
java基于云计算的SaaS医院his信息系统源码 HIS云平台源码
基于云计算技术的B/S架构的HIS系统源码,SaaS模式Java版云HIS系统,融合B/S版电子病历系统,支持电子病历四级,HIS与电子病历系统均拥有自主知识产权。
40 5
|
12天前
|
人工智能 监控 数据可视化
Java智慧工地云平台源码带APP SaaS模式 支持私有化部署和云部署
智慧工地是指应用智能技术和互联网手段对施工现场进行管理和监控的一种工地管理模式。它利用传感器、监控摄像头、人工智能、大数据等技术,实现对施工现场的实时监测、数据分析和智能决策,以提高工地的安全性、效率和质量(技术架构:微服务+Java+Spring Cloud +UniApp +MySql)。
32 4
|
14天前
|
人工智能 监控 安全
JAVA基于SaaS模式的智慧工地云平台源码(云智慧工地解决方案)
智慧工地支持多端展示(PC端、手机端、平板端)SaaS微服务架构,项目监管端,工地管理端源码
20 0
|
14天前
|
搜索推荐 前端开发 Java
java医院绩效考核管理系统项目源码
系统需要和his系统进行对接,按照设定周期,从his系统获取医院科室和医生、护士、其他人员工作量,对没有录入信息化系统的工作量,绩效考核系统设有手工录入功能(可以批量导入),对获取的数据系统按照设定的公式进行汇算,且设置审核机制,可以退回修正,系统功能强大,完全模拟医院实际绩效核算过程,且每步核算都可以进行调整和参数设置,能适应医院多种绩效核算方式。
18 0