Java中的13个原子操作类

点击上方“Java中文社群”,选择“设为星标”

终身学习者,以编程为乐!

来源:https://www.iteye.com/blog/xiaoheng-2509522

atomic 包中的 13 个类,属于 4 中类型的原子更新方式.

  • 原子更新基本类型

  • 原子更新数组

  • 原子更新引用

  • 原子更新属性

atomic 包里的类基本都是使用 Unsafe 实现的包装类.

1.原子更新基本类型

  • AtomicBoolean   

  • AtomicInteger

  • AtomicLong    

本类以 AtomicInteger 进行讲解:

int addAndGet(int delta) 以原子方式将输入的数值与实例中的值相加,并返回结果

boolean compareAndSet(int expect, int update) 如果输入的数值等于预期值,则以原子的方式将该值设置为输入的值.

int getAndIncrement() 以原子方式将当前值加 1,注意,这里返回的是自增前的值.

void lazySet(int newValue) 最终会设置成 newValue,使用 lazySet 设置值后,可能导致其他线程在之后的一小段时间内还是可以读到 旧值.

int getAndSet(int newValue) 以原子方式设置为 newValue 的值,并返回旧值.

getAndIncrement 是如何实现原子操作的了?

public final int getAndIncrement() { for (;;) { int current = get(); int next = current + 1; if (compareAndSet(current, next)) return current; } 
}

我们可以看到,它的实现原理是死循环 + CAS.

2.原子更新数组

  • AtomicIntegerArray 原子更新整形数组里的元素

  • AtomicLongArray 原子更新长整形数组里的元素

  • AtomicReferenceArray 原子更新引用类型数组里的元素

AtomicIntegerArray 类提供方法如下:(1) int addAndGet(int i, int delta) 以原子方式将输入值与数组中的索引 i 的元素相加 (2) boolean compareAndSet(int i, int expect, int update) 如果当前值等于预期值,则以原子方式将数组位置 i 的元素设置成 update 值.

3.原子更新引用类型

原子更新基本类型的 AtomicInteger, 只能更新一个变量,如果要原子更新多个变量,就需要使用这个原子更新引用类型提供的类.    

  • AtomicReference 原子更新引用类型

  • AtomicReferenceFieldUpdate 原子更新引用类型里的字段

  • AtomicMarkableReference 原子更新带有标记位的引用类型.


【END】

关注下方二维码,订阅更多精彩内容

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

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

相关文章

Redis中的键值过期操作

1.过期设置 Redis 中设置过期时间主要通过以下四种方式: expire key seconds:设置 key 在 n 秒后过期;pexpire key milliseconds:设置 key 在 n 毫秒后过期;expireat key timestamp:设置 key 在某个时间戳…

天意PE维护系统 V2021.7.16版

天意PE U盘维护系统是一款用于系统维护和装机的U盘PE系统(U盘启动盘),采用双PE模式,支持UEFI双启动,集成常用工具的维护软件,集成SRS驱动,新版更加上了NVME硬盘的支持,天意U盘维护系统纯净、稳定…

Redis持久化的几种方式——深入解析RDB

Redis 的读写都是在内存中,所以它的性能较高,但在内存中的数据会随着服务器的重启而丢失,为了保证数据不丢失,我们需要将内存中的数据存储到磁盘,以便 Redis 重启时能够从磁盘中恢复原有的数据,而整个过程就…

【LeetCode】148. Sort List

Sort List Sort a linked list in O(n log n) time using constant space complexity. 要求时间复杂度为O(nlogn),那么不能用quickSort了(最坏O(n^2)),所以使用mergeSort. 通常写排序算法都是基于数组的,这题要求基于链…

WordPress网站搬家教程(根目录程序+ MySQL数据库)

WordPress博客网站怎么搬家到新的服务器上?WordPress搬家无非是两点,即WP程序文件和数据库,具体什么系统不用考虑: 3分钟详解WordPress搬家教程 本文新手站长网关于WordPress搬家教程是帮大家缕清思路(参考&#xff1…

Redis持久化的几种方式——RDB深入解析

点击上方“Java中文社群”,选择“设为星标”终身学习者,以编程为乐!Redis 的读写都是在内存中,所以它的性能较高,但在内存中的数据会随着服务器的重启而丢失,为了保证数据不丢失,我们需要将内存…

配置Debian11服务器允许root用户远程SSH登录

全新安装系统后,默认情况下将禁用Debian Linux上的root登录。当您尝试以root用户身份登录Debian11 Linux服务器时,访问将被拒绝。要在Debian Linux系统上为root用户启用SSH登录,您需要首先配置SSH服务器。 0.首先安装SSH 注意:如…

带你深入浅出的分析 HashTable 源码

Hashtable 一个元老级的集合类,早在 JDK 1.0 就诞生了,今天小编想和大家一起来揭开它的面纱!01、摘要在集合系列的第一章,咱们了解到,Map 的实现类有 HashMap、LinkedHashMap、TreeMap、IdentityHashMap、WeakHashMap、…

Debian11服务器系统默认不存在sudo命令的解决办法

1.切换到root用户,安装vim,修改镜像源文件 apt-get install vim vim /etc/apt/sources.list注释掉原有的内容,添加如下阿里云的镜像源 deb http://mirrors.aliyun.com/debian/ bullseye main contrib deb-src http://mirrors.aliyun.com/…

Redis使用不当导致应用卡死

作者:小木来源:http://rrd.me/ezfTj首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,所有api无响应现象刚开始当测试抱怨环境响应慢的时候 ,我们重启一下应用,应用恢复正常,于是没做处…

阿里巴巴Linux开源镜像站 华为Linux开源镜像站 Linux宝塔面板

学习Linux系统和用Linux系统作服务器时,推荐Linux从Linux系统开源镜像站下载,国内源下载速度快,Linux系统可选择方案多! 1.阿里巴巴开源镜像站: https://developer.aliyun.com/mirror/ 2.华为开源镜像站: …

阿里Java开发手册——如何优化数据库?

作者:杨冠宝/高海慧来自:码出高效 Java 开发手册数据库作为服务器端最为最为昂贵的资源之一,如果使用不当常常会导致系统卡顿或系统崩溃,那如何来优化数据库呢?下面来看阿里巴巴《Java开发手册》给出的优化方案。1 建立…

虚拟机VMware Workstation安装Linux服务器Debian11系统详细教程

虚拟机VMware Workstation安装Linux服务器Debian11系统详细教程如下: 准备好: 1.安装好虚拟机VMware Workstation 2.从Linux开源镜像下载的debian11镜像系统 从创建新的虚拟机开始 安装完系统重启进入系统,首先要做的是更新为阿里云的…

借力 Docker ,三分钟搞定 MySQL 主从复制!

hello 各位小伙伴大家好,今年 5 月份的时候,松哥和大家聊过如何搭建 MySQL 主从复制:提高性能,MySQL 读写分离环境搭建(一)提高性能,MySQL 读写分离环境搭建(二)不过很多小伙伴反映在 Linux 中安装 MySQL 比较费劲&…

阿里云服务器Debian11系统安装Linux宝塔面板 搭建WordPress个人博客

阿里云服务器可以使用Debian11镜像系统,在安装Linux宝塔面板,配置LNMP(LinuxNginxMySQLPHP)后,再搭建WordPress个人博客。 一、安装Linux宝塔面板: https://www.bt.cn/ 复制debian安装linux宝塔面板命令&#xff0c…

面试官:聊一下你对MySQL索引的理解?

作者:浪人来源:http://t.cn/AiKmcEefMySQL索引?这玩意儿还能简单聊?明显是在挖坑,幸好老夫早有准备,切听我一一道来。 一、索引是什么?索引是帮助MySQL高效获取数据的数据结构。二、索引能干什么?索引非常…

Linux新建用户可以在shell中切换到该用户也能登录到图形桌面

解决使用useradd testname,passwd testname命令确实创建了一个用户,可以在shell中切换到该用户。但不能登录到图形桌面的问题! 通过下面方法可以在Linux中新建用户,并创建用户主目录,也能登录到图形桌面 1.普通用户先…

这样写Java,同事直呼666

作者:涛姐涛哥来源:cnblogs.com/taojietaoge/p/11575376.html一、MyBatis 不要写 11当遇到多个查询条件,使用where 11 可以很方便的解决我们的问题,但是这样很可能会造成非常大的性能损失,因为添加了 “where 11 ”的过…

Lync Server 2010 安装部署系列三:添加DNS记录

为了让客户端能够自动登录系统,我们需要在DNS服务器上设置创建相关的SRV记录,首先在DNS服务器上创建一条A记录pool.Contoso.com对应IP地址为192.168.1.11,然后创建一条SRV记录对应刚才创建的A记录,服务的内容为_sipinternaltls&am…

Linux系统下MySQL导出数据库和导入数据库的命令

一、MySQL导出数据库用mysqldump命令 注意mysql的安装路径,即此命令的路径,如果你只要查询mysql的运行文件所在地址,直接用下面的命令就可以了,再切换到mysql的运行文件的路径 which mysqlcd /usr/bin/1、导出数据和表结构 命令格…