1、Java中,锁占了并发的一席之地,但是锁带来的弊端就是线程会频繁的阻塞挂起,导致上下文的切换和重新调度,增加了系统开销。CAS 即 Compare and Swap(Change),是 JDK 提供的非阻塞原子性操作 , 它通过硬件保证了比较更新操作的原子性 ,有效减小了因为上下文切换导致的开销问题。

CAS底层使用的是lock cmpxchg指令,在单核CPU和多核CPU下都能保证【比较-交换】的原子性。在多核状态下,某个核执行到带lock的指令时,CPU会让总线锁住,当这个核把此指令执行完毕,再开启总线。这个过程中不会被线程的调度机制锁打断,保证了多个线程内部操作的准确性 和原子性。CAS必须借助volatile才能读取到共享变量的最新值来实现【比较并交换】的效果。

2、AtomicLong都是java并发包JUC下面的类,其底层还是通过cas来保证原子性,因为cas底层通过CPU并发原语lock cmpxchg来保证的,但是这体现到一个缺点,当多个线程都对这个一个变量进行操作,会造成竞争激烈,重试必然频繁发生,反而效率会降低。这时候JDK1.8引入了LongAdder,这个是Doug Lea在1.8对CAS进行的优化。

3、LongAdder核心思想:将热点数据分离。
它可以将AtomicLong内部的内部核心数据value分离成一个数组,每个线程访问时,通过hash等算法映射到其中一个数字进行计数,而最终的计数结果则为这个cell数组的求和累加,其中热点数据value会被分离成多个单元的cell,每个cell独自维护内部的值。当前对象的实际值由所有的cell累计合成,这样热点就进行了有效地分离,并提高了并行度。这相当于将AtomicLong的单点的更新压力分担到各个节点上。在低并发的时候通过对base的直接更新,可以保障和AtomicLong的性能基本一致。而在高并发的时候通过分散提高了性能。

底层通过cell累加单元,一个cell24字节(16个对象头8字节的value),一个缓存行一般是64个字节8个long,因为cell是数组,一个缓存行可以包括两个cell单元,修改一个cell,另一个cell也会失效,所以加上一个**@sun.misc.comtended注解主要是防止缓存行伪对齐**,他对齐的原理就在一个cell前后加上一个padding128字节,这样让每一个cell占用独立的缓存行,这样修改一个cell就不会影响其他的cell。

为什么有了AtomicLong还要新增一个LongAdder呢?

原因是:CAS底层实现是在一个死循环中不断地尝试修改目标值,直到修改成功。如果竞争不激烈的时候,修改成功率很高,否则失败率很高。在失败的时候,这些重复的原子性操作会耗费性能。(不停的自旋,进入一个无限重复的循环中)

LongAdder缺点:如果在统计的时候,如果有并发更新,可能会有统计数据有误差。实际使用中在处理高并发计数的时候优先使用LongAdder,而不是AtomicLong,在线程竞争不激烈的时候,使用AtomicLong会简单效率更高一些。比如序列号生成(准确性)

举个例子:

在LongAdder的底层实现中,首先有一个base值,刚开始多线程来不停的累加数值,都是对base进行累加的,比如刚开始累加成了base = 5(累加到一定数值)。并发更新的线程数量过多时,施行分段CAS的机制(Cell数组,每个数组是一个数值分段)这时,让大量的线程分别去对不同Cell内部的value值进行CAS累加操作,这样就把CAS计算压力分散到了不同的Cell分段数值中了,这样就可以大幅度的降低多线程并发更新同一个数值时出现的无限循环的问题,大幅度提升了多线程并发更新数值的性能和效率!而且他内部实现了自动分段迁移的机制,也就是如果某个Cell的value执行CAS失败了,那么就会自动去找另外一个Cell分段内的value值进行CAS操作。
这样也解决了线程空旋转、自旋不停等待执行CAS操作的问题,让一个线程过来执行CAS时可以尽快的完成这个操作。最后,如果你要从LongAdder中获取当前累加的总值,就会把base值和所有Cell分段数值加起来返回给你。

CAS和AtomicLong和LongAdder相关推荐

  1. AtomicLong与LongAdder执行效率对比

    AtomicLong与LongAdder执行效率对比: package com.mashibing.juc.c_018_00_AtomicXXX;import java.util.concurrent ...

  2. 性能远超AtomicLong,LongAdder原理完全解读

    高并发场景下可以选择 AtomicLong 原子类进行计数等操作,除了 AtomicLong,在 jdk1.8 中还提供了 LongAdder.PS:AtomicLong 在 jdk1.5 版本提供. ...

  3. AtomicLong和LongAdder的区别

    转载自 https://blog.csdn.net/yao123long/article/details/63683991 前言   最近在看到不少框架里面使用到了LongAdder这个类,而并非At ...

  4. 从AtomicLong 到 LongAdder

    AtomicLong性能瓶颈分析 AtomicLong关键代码他用得是Unsafe的代码: public final long getAndAddLong(Object var1, long var2 ...

  5. 性能优化之使用LongAdder替换AtomicLong

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:https://juejin.cn/post/6921595303460241415 写在前面 本篇文章并不会直接进入主题讲为 ...

  6. 多线程与高并发(三):JUC包下新的同步机制:CAS,AtomicInteger,AtomicLong,ReentrantLock,CountDownLatch,ReadWriteLock等

    CAS CAS 是一种乐观锁,syncronized 是一种悲观锁 AtomicInteger AtomicInteger count = new AtomicInteger(0); /*synchr ...

  7. LongAdder和AtomicLong哪个性能更好,为什么?

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/limenghua9112/ article/details/107950744 概述 AtomicLong是作者Doug Le ...

  8. 【078期】java.util.* 并发包下 LongAdder 和 AtomicLong 哪个性能更好,为什么?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方留言必回,有问必答! 每天 08:00 更新文章,每天进步一点点... 概述 ...

  9. LongAdder 和 AtomicLong

    有幸看到一篇关于这个讲解 2个类的讲解,自己也归纳总结一下. 一.解析 看源码底层会发现实现机制不一样,当然这个也是必须的 LongAdder 点进去之后会发现,CAS 它是一个CAS的实现类.至于C ...

最新文章

  1. java rmi漏洞工具_学生会私房菜【20200924】Weblogic WLS核心组件反序列化命令执行突破(CVE20182628)漏洞复现...
  2. HTML5 API详解(10):sessionStorage 你用过吗?
  3. 经典工具 | 使用SIFT预测错义突变的有害性
  4. Qt学习之路(10): Meta-Object系统
  5. php mysql英语在线考试系统+论文
  6. 36. 理解copy_if算法的正确实现
  7. 中国最经典广告语大全
  8. Java实现端口扫描器
  9. 程序员的数学【最优化】
  10. PPT怎么修改母版背景
  11. 酷睿i9 12950HX怎么样 相当于什么水平
  12. 将若干字符串按照字母顺序输出
  13. 2021.10.25-10.31 AI行业周刊(第69期):AI进化之路
  14. JIAR安装报错IRA Startup Failed
  15. lol的不只有英雄联盟,还有程序开发天团!
  16. Java总结 - 中间件
  17. oracle asm磁盘标签丢失导致整个集群和数据库启动失败
  18. 11种dialogBox样式打包开源,逐一详解
  19. “破晓之战”星杯传说赛后复盘分析
  20. 第4章 虚拟机性能监控与故障处理工具

热门文章

  1. 信息学奥赛C++语言:三位数的翻转
  2. python 自动化办公 uibot_【插件开发】使用 Python 扩展 UiBot 的功能
  3. Linux应用程序和驱动程序如何完成交互,应用程序和驱动的简易交互方式的实现...
  4. bartender的安全策略不允许指定的用户执行此操作_Linux sudo 被曝提权漏洞,任意用户均能以 root 身份运行命令...
  5. Python实现RabbitMQ中6种消息模型(转)
  6. 外部表在Hive中的使用
  7. TypeScript环境搭建
  8. A Free CDN For Open Source
  9. H5 水球加载动画 - canvas应用篇
  10. H5小游戏 - canvas涂鸦板