码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 基础 | 并发编程 - [原子类]


    INDEX

        • §1 总览
        • §2 基本类型原子类
        • §3 数组类型原子类
        • §4 引用类型原子类
        • §4 属性修改原子类
        • §5 原子操作增强
        • §6 原子操作底层类

    §1 总览

    原子类大多在包 java.util.concurrent.atomic 下

    原子型基础型类型说明
    AtomicBooleanboolean基本
    AtomicIntegerint基本
    AtomicIntegerArrayint[]数组
    AtomicIntegerFieldUpdater
    AtomicLonglong基本
    AtomicLongArraylong[]数组
    AtomicLongFieldUpdater
    AtomicMarkableReference
    AtomicReferenceObject引用
    AtomicReferenceArrayObject[]数组
    AtomicReferenceFieldUpdater
    AtomicStampedReference
    DoubleAccumulator
    DoubleAdder
    LongAccumulator
    LongAdder

    通用 api

    • get()
      获取
    • getAndSet()
      获取并赋予新值,相当于 i=x
    • getAndIncrement()
      获取并自增,相当于 i++
    • getAndDecrement()
      获取并自减,相当于 i--
    • getAndAdd()
      获取并在原值基础上 + 差值,相当于 i+=x
    • compareAndSet()
      比较,如果相等就赋予新值

    §2 基本类型原子类

    基础数据类型原子类

    • AtomicBoolean,相当于 boolean
    • AtomicInteger,相当于 int
    • AtomicLong,相当于 long

    示例

    AtomicInteger atomicInteger = new AtomicInteger(10);
    atomicInteger.getAndIncrement();//相当于 i++
    
    • 1
    • 2

    §3 数组类型原子类

    数组数据类型原子类
    类似 基础数据类型原子类

    • AtomicBooleanArray,相当于 boolean[]
    • AtomicIntegerArray,相当于 int[]
    • AtomicLongArray,相当于 long[]

    §4 引用类型原子类

    引用类型原子类

    • AtomicReference
      相当于 Object
      常用于实现基于线程的自旋锁
      不能处理 ABA 问题
    • AtomicStamptReference
      在 AtomicReference 增加了版本信息
      常用于实现基于线程的自旋锁
      可以处理 ABA 问题
    • AtomicMarkableReference
      在 AtomicReference 增加了修改标记
      修改值前,应判断修改标记 isMarked()
      修改值时,应同步修改 修改标记 ,compareAndSet(old, new, oldMark, !oldMark)
      可以处理 ABA 问题,相对于 AtomicStamptReference 只关心是否被改过,而不关心更改次数

    注意
    引用类型原子类只能 CAS 引用本身,而不是引用内部的字段值

    User user = new User();
    AtomicReference<User> atomicUser = new AtomicReference<>();
    atomicUser.set(user);
    atomicUser.compareAndSet(user,new User());
    
    • 1
    • 2
    • 3
    • 4

    §4 属性修改原子类

    • 用于对非线程安全的字段进行 线程安全 的修改
    • 基于反射实现
    • 被修改的字段必须被 public volatile 修饰

    包含下面三个类

    • AtomicIntegerFieldUpdater
    • AtomicLongFieldUpdater
    • AtomicReferenceFieldUpdater
    AtomicIntegerFieldUpdater<User> updater = 
    	AtomicIntegerFieldUpdater.newUpdater(User.class,"age");
    
    updater.getAndIncrement(user);
    
    • 1
    • 2
    • 3
    • 4

    §5 原子操作增强

    • DoublAccumulator
    • DoubleAdder
    • LongAccumulator
    • LongAdder

    应用场景
    适用于不要求实时精确,的基础数据累加

    • 点赞计数器
    • int[] 所有元素 ++

    与 AtomicLong 比较

    • 高并发场景下性能提高,减少 cas 消耗(大约一个数量级)
    • 不能保证实时精准

    LongAdder 和 LongAccumulator 的区别

    初始值加值
    LongAdder只能是 0只能是 1
    LongAccumulator任意任意
    LongAdder adder = new LongAdder();
    adder.increment();
    adder.increment();
    System.out.println(adder.sum()); // 2
    
    LongAccumulator accumulator = new LongAccumulator((x,y)->x+y,0);
    accumulator.accumulate(1);
    accumulator.accumulate(2);
    System.out.println(accumulator.get()); // 3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    源码
    详见 基础 | 并发编程 - [Striped64]

    §6 原子操作底层类

    • Number
    • Striped64
      详见 基础 | 并发编程 - [Striped64]
  • 相关阅读:
    【前端三栏布局总结】常见的前端三栏布局有哪些
    宁波大学NBU计算机嵌入式系统期末考试题库(二)
    如何使用扫码SDK获取扫描成功之后的原图?
    爱上C语言:操作符详解(下)
    vue3+elementPlus el-input的type=“number“时去除右边的上下箭头
    Boundary (topology)
    苹果曝出严重安全漏洞,黑客可全面接管设备!!!
    【Linux】文件IO基础知识——下篇, 什么是软硬链接?如何用别人的动静态库??
    CV每日论文--2024.4.25
    2023年Q3乳品行业数据分析(乳品市场未来发展趋势)
  • 原文地址:https://blog.csdn.net/ZEUS00456/article/details/126823407
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号