Android 原子性类型都有哪些

1. 基本类型原子类

  • AtomicInteger:用于对整数进行原子操作,如incrementAndGet()方法可以原子地将当前值加1并返回新值,getAndSet()方法可以原子地设置新值并返回旧值。
  • AtomicLong:和AtomicInteger类似,用于长整型的原子操作。在处理高并发场景下的计数(例如网站的访问量计数等场景),如果计数可能超出int范围,就可以使用AtomicLong。
  • AtomicBoolean:提供原子性的布尔值操作。例如在多线程环境下,用于标志某个资源是否被占用或者某个任务是否完成等场景。

2. 引用类型原子类

  • AtomicReference:可以原子地更新引用对象。比如在实现一个简单的对象缓存时,使用AtomicReference可以确保在多线程环境下安全地更新缓存中的对象引用。
  • AtomicStampedReference:在AtomicReference的基础上,增加了一个“版本号”(或者称为“时间戳”)的概念。它可以用于解决在并发环境下,对象可能被多次修改而导致的ABA问题。例如,在一个链表结构的并发操作中,一个节点可能被删除后又插入相同的节点,使用AtomicStampedReference可以区分这种情况。
  • AtomicMarkableReference:也是一种带有标记的原子引用类。它主要用于标记对象是否被删除或者其他简单的二元状态标记场景,相比AtomicStampedReference更简单,只关心两种状态。

3. 数组类型原子类

  • AtomicIntegerArray:对整数数组进行原子操作。假设一个多线程环境下的图像处理程序,需要对图像像素数组(假设像素值用整数表示)进行操作,AtomicIntegerArray可以保证每个像素值的操作原子性。
  • AtomicLongArray:用于长整型数组的原子操作。例如在一个金融数据分析系统中,可能有一个长整型数组用于记录多个金融产品的交易金额累计值,在多线程环境下更新这些数据时可以使用AtomicLongArray。
  • AtomicReferenceArray:对引用数组进行原子操作。比如在一个游戏服务器中,有一个玩家对象引用数组,在多线程环境下更新玩家对象引用(如玩家重新登录等情况)可以使用AtomicReferenceArray来保证操作的原子性。

4. 字段更新器原子类(用于原子地更新对象的某个字段)

  • AtomicIntegerFieldUpdater:用于原子地更新对象中的int类型字段。例如,在一个复杂的业务对象中,有一个int类型的状态字段,在多线程环境下需要原子地更新这个状态字段时可以使用。
  • AtomicLongFieldUpdater:用于原子地更新对象中的long类型字段,应用场景和AtomicIntegerFieldUpdater类似,只是针对长整型字段。
  • AtomicReferenceFieldUpdater:用于原子地更新对象中的引用类型字段。例如在一个包含用户对象的业务对象中,有一个引用类型字段表示用户的当前权限对象,在多线程环境下需要原子地更新这个权限对象引用时可以使用。

5. Adder和Accumulator类(Java 8引入)

  • LongAdder
    • 介绍:它是对AtomicLong的一种优化,在高并发的场景下提供了更高的性能。LongAdder在内部维护了多个变量(Cell数组)来分散并发更新的压力,而不是像AtomicLong那样在一个变量上进行竞争操作。
    • 应用场景和示例:例如在一个大规模的分布式系统中,统计各个节点的请求处理数量。多个线程频繁地更新这个计数,使用LongAdder可以有效减少竞争,提高并发性能。
import java.util.concurrent.atomic.LongAdder;
class RequestCounter {private LongAdder counter = new LongAdder();public void increment() {counter.add(1);}public long getCount() {return counter.sum();}
}
  • DoubleAdder
    • 介绍:类似于LongAdder,不过它是用于双精度浮点数(double)的累加器。在需要对浮点数进行高并发累加操作的场景下很有用。
    • 应用场景和示例:比如在一些科学计算或者金融数据统计场景中,需要对一系列双精度浮点数进行求和,并且这些求和操作可能会被多个线程同时执行。
  • LongAccumulator
    • 介绍LongAccumulator提供了一种更灵活的方式来对长整型数据进行累积操作。它允许你指定一个自定义的累积函数,而不仅仅是简单的加法。
    • 应用场景和示例:例如,你可以定义一个乘法累积函数来计算一系列数字的乘积。
import java.util.concurrent.atomic.LongAccumulator;
class ProductCalculator {private LongAccumulator accumulator;public ProductCalculator() {// 初始化LongAccumulator,第一个参数是累积函数(这里是乘法),第二个参数是初始值accumulator = new LongAccumulator((x, y) -> x * y, 1);}public void addValue(long value) {accumulator.accumulate(value);}public long getProduct() {return accumulator.get();}
}
  • DoubleAccumulator
    • 介绍:和LongAccumulator类似,但是用于双精度浮点数的累积操作,并且可以自定义累积函数,适用于更复杂的浮点数累积计算场景。

转自AI豆包

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

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

相关文章

MySQL45讲 第十六讲 “order by”是怎么工作的?

文章目录 MySQL45讲 第十六讲 “order by”是怎么工作的?一、引言二、全字段排序(一)索引创建与执行情况分析(二)执行流程(三)查看是否使用临时文件 三、rowid 排序(一)参…

『YOLO』断点训练、解决训练中断异常情况

文章目录 方法一方法二 当yolo在训练的时候,如果训练中断或者出现异常,可通过修改代码,从上一次断掉处重新训练,实现断点续训。 方法一 第一种方法: 按照官方给出的恢复训练代码,用yolo命令格式&#xff…

网页版五子棋—— WebSocket 协议

目录 前言 一、背景介绍 二、原理解析 1.连接过程(握手) 2.报文格式 三、代码示例 1.服务端代码 (1)TestAPI 类 (2)WebSocketConfig 类 2.客户端代码 3.代码演示 结尾 前言 从本篇文章开始&am…

【综合案例】使用React编写B站评论案例

一、效果展示 默认效果,一开始默认按照最热进行排序 发布了一条评论 按照最新进行排序 按照最新进行排序 二、效果说明 页面上默认有3条评论,且一开始进入页面的时候是按照点赞数量进行倒序排列展示,可以点击【最热 、最新】进行排序的切换。…

docker镜像文件导出导入

1. 导出容器(包含内部服务)为镜像文件(docker commit方法) 原理:docker commit命令允许你将一个容器的当前状态保存为一个新的镜像。这个新镜像将包含容器内所有的文件系统更改,包括安装的软件、配置文件等…

区块链技术与应用-PKU 学习笔记

课程地址 资料: ETH-Security 区块链学习记录_比特币 BTC 密码学原理 比特币,又称加密货币(crypto-currency),它主要利用了密码学中的哈希函数(cryptographic hash function)的抗碰撞特性(collision resistance)和单向散列特性(hiding) …

在Java中,实现数据库连接通常使用JDBC

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技巧(编写中……) 5、面经吐血整理的 面试技…

C++网络编程之IO多路复用(一)

概述 在C网络编程中,处理并发连接是一个非常关键的核心问题。为了有效管理来自多个客户端的请求,服务器需要能够同时监听多个套接字上的事件,这通常通过IO多路复用来实现。 IO多路复用是一种工作机制,它可以让程序监视多个文件描述…

【优选算法 — 双指针】双指针小专题

和为 s 的两个数 和为s的两个数 题目描述 解法一:暴力枚举 暴力枚举,先固定一个数,然后让这个数和另一个数匹配相加, 如果当前的数 所有剩余的数 target,则返回这两个数,否则固定下一个数&#…

并查集(基础学习与应用)

并查集 基本原理: 对于多个集合,每个集合中的多个元素用一颗树的形式表示,根节点的编号即为整个集合的编号,每个树上节点存储其父节点,使得当前集合的每个子节点都可以通过对父节点的询问来找到根节点,根…

003-Kotlin界面开发之声明式编程范式

概念本源 在界面程序开发中,有两个非常典型的编程范式:命令式编程和声明式编程。命令式编程是指通过编写一系列命令来描述程序的运行逻辑,而声明式编程则是通过编写一系列声明来描述程序的状态。在命令式编程中,程序员需要关心程…

Spring Boot 与 Vue 共筑地方特色美食分享卓越平台

作者介绍:✌️大厂全栈码农|毕设实战开发,专注于大学生项目实战开发、讲解和毕业答疑辅导。 🍅获取源码联系方式请查看文末🍅 推荐订阅精彩专栏 👇🏻 避免错过下次更新 Springboot项目精选实战案例 更多项目…

react使用Fullcalendar 实战用法

使用步骤请参考:react使用Fullcalendar 卡片式的日历: 需求图: 卡片式的日历,其实我是推荐 antd的,我两个都写了一下都能实现。 antd 的代码: antd的我直接用的官网示例:antd 日历示例 i…

Apache Solr 身份认证绕过导致任意文件读取漏洞复现(CVE-2024-45216)

0x01 产品简介 Apache Solr是一个开源的搜索平台,基于流行的Apache Lucene库构建。它提供了一个强大的全文搜索功能,能够快速处理大量数据,并支持复杂的搜索操作。并且是一个独立的企业级搜索应用服务器,它采用Java开发,并基于Apache Lucene实现。Solr提供了类似于Web-Se…

Flutter 正在切换成 Monorepo 和支持 workspaces

其实关于 Monorepo 和 workspaces 相关内容在之前《Dart 3.5 发布,全新 Dart Roadmap Update》 和 《Flutter 之 ftcon24usa 大会,创始人分享 Flutter 十年发展史》 就有简单提到过,而目前来说刚好看到 flaux 这个新进展,所以就再…

在做题中学习(74):比较含退格的字符串

解法:用栈来模拟 思路:不用真的定义一个栈,用字符串string来模拟栈的行为 入栈:s[i] ! #时 push_back(s[i]) 出栈:s[i] # 的时候,并且s.size() > 0,pop_back(s[i])循环结束得到结果 注意:如果真的…

前后端交互通用排序策略

目录 排序场景 排序实现思路 1. 静态代码排序实现 2.数据库驱动排序实现 3. 基于Java反射的动态排序实现 通用排序工具 SortListUtil 结语 排序场景 在面向前端数据展示的应用场景中,我们旨在实现一个更加灵活的排序机制,该机制能够支持对从后端传递…

java 中List 的使用

List集合是Collection接口的子接口,其下有两个实现类分别为ArrayList和 LinkedList List是一个接口,不能用new创建对象,需要用 ArrayList类 和 LinkedList类 来创建 特点 有序:存储元素的顺序和取出元素的顺序一致可以重复&…

MD5(Crypto)

解题思路 打开文件发现一串代码,结合题目提示,应该是 MD5 加密。 找个在线的 MD5 解密网站,行云流水得到 flag。 题目设计原理 题目设计:无他,MD5 加密。 题目原理: MD5(Message-Digest Algo…

跟李沐学AI:BERT

什么是NLP中的迁移学习 使用预训练好的模型来抽取词、句子的特征:Word2Vec或者预训练好的语言模型。 使用预训练好的语言模型,一般不会再对语言模型进行微调,即不进行更新。 Word2Vec一般用于替代embedding层 但是Word2Vec往往忽略了时序…