java cas/longAdder

cas在java中是如何实现的?

  cas通过调用JNI,通过借助c语言来调用cpu底层指令实现,以intel x86平台举例,最终映射的指令是cmpxchg 来实现比较并替换操作

cmpx如何保证多核心下的线程安全?

  如果是多线程 系统会对总线加锁,只有一个线程可以对总线加锁成功,加锁成功后执行cas操作

cas存在的问题?

  面临ABA问题,解决方法是加一个版本号

 

longAdder

对于cas操作当多线程高并发的请求的时候执行效率还是会受影响,这时longAdder就登场了

LongAdder中有一个base值 和一个cell数组  每个cell对象中持有一个Long值

base值是当没有冲突的时候 数值加到base上,或者cells扩容的时候数值加到base上

 

核心的方法是 longAccumulate()方法,

当cells数组为空的时候就创建一个长度为2的cell数组 并把值存入线程对应的cell

当cells数组不为空 线程对应的cell为空 就把cell存入数组对应的位置

当cells数组不为空 线程对应的cell也不为空  第一次会重试一次自旋 如果重试失败 会开启重试意向值 并rehash线程的hash值 然后自旋 如果自旋还失败 就进行扩容

扩容就是cells数组翻倍 并把旧值迁移

posted @   rudynan  阅读(94)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示