AtomicIntegerArray使用、核心源码解析

1、API方法使用

  • 构造方法
AtomicIntegerArray atomicIntegerArray1 = new AtomicIntegerArray(100);
源码:
private final int[] array;
public AtomicIntegerArray(int var1) {this.array = new int[var1];
}
int[] array = {10, 20, 30, 0, 0};
AtomicIntegerArray arr = new AtomicIntegerArray(array);源码:
private final int[] array;
public AtomicIntegerArray(int[] var1) {this.array = (int[])var1.clone();
}

底层就是一个数组。

下面方法使用arr对象进行演示。

 int[] array = {10, 20, 30, 0, 0};AtomicIntegerArray arr = new AtomicIntegerArray(array);
  • get(int var1): 获取指定下标的数据
int re = arr.get(1);
System.out.println(re);  //20
  • set(int var1, int var2) 设置指定下标位置的值
  • lazySet(int var1, int var2)
    var1: 数组的下标
    var2: 目标值
arr.set(3,1000);
System.out.println(arr.get(3));  //1000arr.lazySet(4,2000);
System.out.println(arr.get(4));  //2000
  • length(): 返回数组的长度
System.out.println(arr.length()); //5
  • accumulateAndGet(int var1, int var2, IntBinaryOperator var3) : 设置新值并返回最终结果
    //参数1 数组下标
    //参数2 新值
    //参数3 自定义算法(入参: 原值,新值 。 出参:计算结果)
int i1 = arr.accumulateAndGet(0, 200, (x, y) -> x + y);
System.out.println(i1);  //210
System.out.println(arr.get(0));   //210源码:
public final int accumulateAndGet(int var1, int var2, IntBinaryOperator var3) {long var4 = this.checkedByteOffset(var1);int var6;int var7;do {//获取原始值var6 = this.getRaw(var4);var7 = var3.applyAsInt(var6, var2);} while(!this.compareAndSetRaw(var4, var6, var7));return var7;}
  • compareAndSet(int var1, int var2, int var3) : 给定预期值 若指定位置的原值=预期值 则设置新值反之不进行设置
  • weakCompareAndSet(int var1, int var2, int var3)
    //参数1: 数组下标位置
    //参数2: 预期值
    //参数3: 新值
boolean b = arr.compareAndSet(1, 50, 30);
System.out.println(b);  //false
System.out.println(arr.get(1));  //20源码:public final boolean compareAndSet(int var1, int var2, int var3) {return this.compareAndSetRaw(this.checkedByteOffset(var1), var2, var3);}
  • decrementAndGet(int var1): 指定位置元素值自减1并且返回最终值
int i = arr.decrementAndGet(1);
System.out.println(i);  //19
System.out.println(arr.get(1));  //19
源码:
public final int decrementAndGet(int var1) {return this.getAndAdd(var1, -1) - 1;
}public final int getAndAdd(int var1, int var2) {return unsafe.getAndAddInt(this.array, this.checkedByteOffset(var1), var2);
}  public final int getAndAddInt(Object var1, long var2, int var4) {int var5;do {var5 = this.getIntVolatile(var1, var2);} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));return var5;
}
  • incrementAndGet(int var1): 指定位置元素值自加1并且返回最终值
int i = arr.incrementAndGet(1);
System.out.println(i);  //21
System.out.println(arr.get(1));  //21
  • getAndAccumulate(int var1, int var2, IntBinaryOperator var3) :设置元素新值并返回原始值
    //参数1: 数组下标
    //参数2: 新值
    //参数3: 函数值计算 ->计算出新值
int andAccumulate = arr.getAndAccumulate(1, 200, (x, y) -> x + y);
System.out.println(andAccumulate);  // 20
System.out.println(arr.get(1));  //220
  • getAndDecrement(int var1): 指定位置元素自减1 并且返回原始值
int andDecrement = arr.getAndDecrement(1);
System.out.println(andDecrement);  //20
System.out.println(arr.get(1));   //19
  • getAndIncrement(int var1) :指定位置元素自加1 并且返回原始值
int andDecrement = arr.getAndIncrement(1);
System.out.println(andDecrement);  //20
System.out.println(arr.get(1));   //21
  • getAndSet(int var1, int var2): 设置新值并返回原始值
int andSet = arr.getAndSet(1, 9000);
System.out.println(andSet);  //20
System.out.println(arr.get(1));  //9000
  • updateAndGet(int var1, IntUnaryOperator var2) :
int i = arr.updateAndGet(1, x -> x + 100);
System.out.println(i);   //120
System.out.println(arr.get(1));  //120
  • updateAndGet(int var1, IntUnaryOperator var2):
int i = arr.updateAndGet(1, x -> x + 100);
System.out.println(i);  //120
System.out.println(arr.get(1)); //120

2、核心源码

AtomicIntegerArray.java
private static final int base;
private static final int shift;static {base = unsafe.arrayBaseOffset(int[].class);int var0 = unsafe.arrayIndexScale(int[].class);if ((var0 & var0 - 1) != 0) {throw new Error("data type scale not a power of two");} else {shift = 31 - Integer.numberOfLeadingZeros(var0);}
}

base: 对象中int数组的偏移地址
shift: 偏移位数
在这里插入图片描述
cas需要三个参数(绝对地址,期望值,新值),根据绝对地址获取值然后与期望值进行比较,若相等则更新为新值,反之不更新。

数组中指定位置元素的绝对地址如何获取 ?
首先需要直到对象的首地址(绝对地址);
其次需要知道数组的首地址(相对地址,相对对象首地址偏移);
知道数组中每个元素占用的字节,元素占用的字节*元素的下标=元素的偏移地址(相对数组首地址偏移);
上述三个地址之和等于指定位置元素的绝对地址。

base = unsafe.arrayBaseOffset(int[].class): 获取数组的首地址;
int var0 = unsafe.arrayIndexScale(int[].class);: 获取数组中单个元素占用的字节大小;
Integer.numberOfLeadingZeros(var0): 计算出前面有多少个0;
int shift = 31 - Integer.numberOfLeadingZeros(var0); 计算出需要左移多少位;
举例: 假设是int[] 单个元素占用4字节, 第5个元素的首地址应该是(前面有4个元素)
4 * 4 = 16;

此时 var0 = 4
Integer.numberOfLeadingZeros(var0) 前面有29个0;
int shift = 31 - Integer.numberOfLeadingZeros(var0); // = 2
第五个元素; 数组下标=4; 4 << 2 = 16; 效率更高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/416086.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

伦理学(Ethics)

讯飞星火 伦理学哲学是一门关于道德问题的科学&#xff0c;旨在系统化和理论化道德思想观点。作为一门独立的哲学分支学科&#xff0c;伦理学的本质是对道德现象进行研究&#xff0c;包括道德意识、道德行为以及道德规范现象等。 伦理学的研究对象广泛&#xff0c;涉及个人的…

驱动(RK3588S)第六课时:linux2.6的使用与GPIO子系统的使用

目录 一、Linux2.6 字符设备驱动编写框架1、合成一个完整的设备号函数2、从完整的设备号里提取主设备号3、动态申请设备号4、静态申请设备号5、释放申请的设备号6、Linux2.6 字符设备驱动的核心结构体7、初始化核心结构体8、向内核去申请 linux2.6 字符设备9、释放申请的设备10…

哈希 详解

目录 1. “哈希”是什么&#xff1f; 2. 哈希冲突 3. 哈希函数 3.1 设计原则 3.2 常见哈希函数 4. 解决哈希冲突的两种常见方法 4.1 闭散列 4.2 开散列 4.3 散列表的扩容问题 5. 哈希表的实现 并 封装模拟实现unordered系列容器 6. 哈希的应用 6.1 位图 -- bitset …

【js逆向专题】2.浏览器调试技巧

小节目标: 熟悉 开发者工具的使用熟悉 代码断点的方式熟悉 网页debugger实现方式 一. 浏览器开发者工具 1. element元素面板 展示浏览器渲染之后的页面 2. network网络面板 浏览器请求的数据都会加载在网络面板 3. console控制台面板 可以在控制台调试你对应的代码 4.…

3000字带你了解SD提示词用法,一点就通,小白轻松上手(附提示词生成器)(1.4 SD提示词运用)

提示词是什么 提示词是我们向AI模型发出的指令。正确的提示词能让AI准确反馈所需的输出&#xff0c;而优质的提示词则能使AI生成的内容更优质、更符合你的期望。这与编写程序代码颇为相似&#xff0c;准确的代码逻辑是程序正常运行的前提&#xff0c;而优秀的代码则能减少运行…

Vue基础概述

Vue框架概述 什么是Vue框架 Vue是一种流行的渐进式JavaScript框架&#xff0c;用于构建Web用户界面。它具有易学、轻量级、灵活性强、高效率等特点&#xff0c;并且可以与其他库和项目集成。是目前最流行的前端框架之一.框架的两种用法: 多页面应用: 在html页面中引入vue.js框…

全倒装共阴节能COB超微小间距LED显示屏主导新型显示技术

COB&#xff08;Chip on Board&#xff09;技术最早发源于上世纪60年代&#xff0c;是将LED芯片直接封装在PCB电路板上&#xff0c;并用特种树脂做整体覆盖。COB实现“点” 光源到“面” 光源的转换。点间距有P0.3、P0.4、P0.5、P0.6、P0.7、P0.9、P1.25、P1.538、P1.5625、P1.…

NanoPC-T6安装redriod笔记

这里主要用于自己对安装过程的记录&#xff0c;中间可能记录比较粗糙。 重新编译内核 参考链接&#xff1a;【环境搭建】基于linux的NanoPC-T6_LTS系统固件编译环境搭建 基于docker构建编译环境 docker run -it \ --privilegedtrue --cap-addALL \ --name nanopc_t6_lts_en…

ESP32!Thonny+MicroPython+ESP32开发环境搭建!!

准备工具&#xff1a; ThonnyMicroPythonESP32 一.Thonny安装 下载地址&#xff1a;Thonny, Python IDE for beginnershttps://thonny.org/ 二.下载esp32环境——根据型号下载 下载地址&#xff1a;MicroPython - Python for microcontrollershttps://micropython.org/dow…

Spring Boot 多数据源配置(JPA)

目录 前言 前置环境 pom yml Entity Dao Config Controller 演示 前言 一般一个系统至少有一个数据源&#xff0c;用来持久化业务数据以及查询。单个数据源的系统很常见&#xff0c;在 Spring Boot 框架下配置也很简单。在约定大于配置这个思想下&#xff0c;只需要在…

vue 中计算属性可以接收参数

代码中的value就是接收的参数 计算属性要接收参数要写在返回的时候 computed: {isButtonDisabled() {return (value) > {const num parseInt(value);return isNaN(num) || num < 0}},},//计算属性aaa(){return (value) >{写逻辑return 返回值}} 使用 <el-butto…

Python OpenCV 深入理解(二)

引言 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个用于计算机视觉的开源软件库。它提供了大量的图像处理和机器视觉功能&#xff0c;支持多种编程语言&#xff0c;其中Python接口因其易用性和快速原型设计能力而受到广泛欢迎。本文将详细介绍如何…

基于OMS构建OceanBase容灾双活架构的实践

在实际生产环境中&#xff0c;对于关键业务&#xff0c;往往会有容灾双活的需求。除了OceanBase提供的主备库能力&#xff0c;通过官方工具OMS也可以实现容灾双活架构。目前&#xff0c;通过OMS实现的双活架构仅支持OceanBase数据库之间的数据同步。 要通过OMS实现双活架构&am…

合宙LuatOS开发板Core_Air780EP使用说明

Core-Air780EP 开发板是合宙通信推出的基于 Air780EP 模组所开发的&#xff0c; 包含电源&#xff0c;SIM卡&#xff0c;USB&#xff0c;天线&#xff0c;音频等必要功能的最小硬件系统。 以方便用户在设计前期对 Air780EP模块进行性能评估&#xff0c;功能调试&#xff0c;软…

快速学习GO语言总结

干货分享&#xff0c;感谢您的阅读&#xff01;备注&#xff1a;本博客将自己初步学习GO的总结进行分享&#xff0c;希望大家通过本博客可以在短时间内快速掌握GO的基本程序编码能力&#xff0c;如有错误请留言指正&#xff0c;谢谢&#xff01; 一、初步了解Go语言 &#xf…

基于约束大于规范的想法,封装缓存组件

架构&#xff1f;何谓架构&#xff1f;好像并没有一个准确的概念。以前我觉得架构就是搭出一套完美的框架&#xff0c;可以让其他开发人员减少不必要的代码开发量&#xff1b;可以完美地实现高内聚低耦合的准则;可以尽可能地实现用最少的硬件资源&#xff0c;实现最高的程序效率…

职业院校如何建设人工智能实训室

随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;越来越多的职业院校开始意识到培养具备AI技能的人才的重要性。为了让学生能够在实践中学习&#xff0c;职业院校需要建立能够支持实际操作的人工智能实训室。本文将探讨职业院校应该如何规划和建设一个高效且…

大模型产品经理学习路线,2024最新,从零基础入门到精通,非常详细收藏我这一篇

随着人工智能技术的发展&#xff0c;尤其是大模型&#xff08;Large Model&#xff09;的兴起&#xff0c;越来越多的企业开始重视这一领域的投入。作为大模型产品经理&#xff0c;你需要具备一系列跨学科的知识和技能&#xff0c;以便有效地推动产品的开发、优化和市场化。以下…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 09部署OSPF

本章的目的是帮助网络工程师确定网络的理想 OSPF 配置。本章将回答以下问题 应何时在数据中使用OSPF ?配置 OSPF 的关键设计原则是什么?OSPFv2 和 OSPFv3 之间有什么区别&#xff0c;应如何使用?如何在路由协议栈中配置 OSPF ?如何在服务器上配置 OSPF&#xff0c;例如为容…

Electron 项目实战 03: 实现一个截图功能

实现效果 实现思路 创建两个window&#xff0c;一个叫mainWindow&#xff0c;一个叫cutWindowmainWindow&#xff1a;主界面用来展示截图结果cutWindow&#xff1a;截图窗口&#xff0c;加载截图页面和截图交互逻辑mainWindow 页面点击截图&#xff0c;让cutWIndow 来实现具体…