Java面试八股之Java中有哪些原子类,原理是什么

  1. Java中有哪些原子类,原理是什么

AtomicInteger 和 AtomicLong:

用于对整数(int)和长整数(long)进行原子操作。

原理:它们内部封装了一个整型或长整型变量,并通过使用Unsafe类提供的CAS(Compare-and-Swap)操作来实现原子更新。CAS是一种无锁的同步机制,它在更新值时会检查预期值是否与当前值相等,如果相等则更新为新值,否则不进行任何改变。这种操作是原子的,即不会被其他线程中断,确保了多线程环境下更新的原子性和可见性。同时,这些类还使用了volatile关键字来确保变量的内存可见性,即当一个线程修改了该变量的值时,其他线程能够立即看到最新值。

AtomicBoolean:

用于对布尔值进行原子操作。

原理:类似于AtomicInteger和AtomicLong,AtomicBoolean内部封装了一个布尔值,并同样使用CAS操作来实现原子的set、getAndSet、compareAndSet等操作。volatile关键字同样用于确保布尔值的可见性。

AtomicReference:

用于对引用类型进行原子操作。

原理:它封装了一个对象引用,并通过CAS操作来原子地更新引用指向的对象。compareAndSet方法会比较当前引用与预期引用是否一致,一致则替换为新的引用,否则不作更改。同样,volatile关键字确保了对象引用的可见性。

AtomicIntegerArray 和 AtomicLongArray:

分别用于对整型数组和长整型数组进行原子操作。

原理:这两个类提供了对数组元素的原子更新操作,如getAndAdd、compareAndSet等。它们同样基于CAS机制,在更新数组元素时确保原子性,同时使用volatile数组元素来保证多线程环境下的可见性。

AtomicStampedReference:

带有标记(stamp)的引用类型原子操作类。

原理:除了维护一个引用外,还附加了一个整数标记。在进行原子更新时,不仅比较引用本身,还会比较标记值。这种设计可以解决ABA问题(即一个值被多次改变后又变回原始值,但期间发生了其他变化,仅通过比较值本身无法察觉)。compareAndSet方法会同时检查引用和标记是否符合预期,只有两者都满足条件才会更新。

AtomicIntegerFieldUpdater 和 AtomicLongFieldUpdater,以及 AtomicReferenceFieldUpdater:

这些类允许对指定类的某个非静态整型、长整型或引用类型字段进行原子更新。

原理:它们使用反射机制获取并操作指定对象的字段,同样基于CAS来实现原子更新。由于需要反射,使用时需提供目标类、字段名和访问权限修饰符。这些类适用于无法直接修改源代码以使用原子类的情况,但使用较为繁琐,且可能存在性能损失。

注:CAS是一种基于硬件级别的无锁同步算法,它通过原子性地比较和交换内存中的值来实现线程安全的更新操作。在Java中,CAS主要通过Unsafe类提供的方法实现,并被广泛应用在java.util.concurrent.atomic包下的原子类中。虽然CAS带来了高性能和无阻塞的优点,但也存在ABA问题、潜在的自旋开销以及对复杂同步场景支持不足等挑战。

  如果大家需要视频版本的讲解,欢迎关注我的B站:

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

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

相关文章

HarmonyOS - 记一次HSP异常堆栈无法定位问题

问题背景 HSP混淆打包之后无法定位异常堆栈,问题堆栈为: MyModules/build/default/cache/default/defaultCompileArkTS/esmodule/release/MyModules/src/main/ets/d/r.ts:1:1 问题原因: 导致无法定位问题的原因是,混淆时开启了代码…

OpenHarmony 实战开发——ArkUI容器类API介绍

容器类,顾名思义就是存储的类,用于存储各种数据类型的元素,并具备一系列处理数据元素的方法。在 ArkUI 开发框架中,容器类采用了类似静态的语言来实现,并通过 NAPI 框架对外提供。通过对存储位置以及属性的限制&#x…

关于数据结构B+TREE 和 HASH的整理

一、BTREE BTree是一种树数据结构,是B-Tree的变种,属于n叉排序树,每个节点通常有多个孩子。 BTree是和B-Tree相比,BTree的所有的数据都会出现在叶子节点上,并且叶子节点会形成一个单向链表,非叶子节点仅仅…

C++map容器关联式容器

Cmap 1. 关联式容器 vector、list、deque、forward_list(C11)等STL容器,其底层为线性序列的数据结构,里面存储的是元素本身,这样的容器被统称为序列式容器。而map、set是一种关联式容器,关联式容器也是用来存储数据的&#xff0…

日期问题,

日期问题 ac代码 #include <cstdio> #include <iostream>using namespace std;int days[13] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};bool check_valid(int year, int month, int day) {if (month 0 || month > 12) return false;if (day 0) …

【开发】模型部署笔记

目录 模型量化 模型量化 1、模型量化优点 低精度模型表示模型权重数值格式为FP16&#xff08;半精度浮点&#xff09;或者INT8&#xff08;8位定点整数&#xff09;&#xff0c;但是目前低精度往往就指代INT8。常规精度模型则一般表示模型权重数值格式为FP32&#xff08;32位…

求数组最大值

#include <bits/stdc.h> using namespace std; int main(){int a[4]{1,2,3,4};cout<<*max_element(a,a4);return 0; }

策略模式详解

策略模式 1 概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿&#xff0c;开发需要选择一款开发工具&#xff0c;当然可以进行代码开发的工具有很多&#xff0c;可以选择Idea进…

JavaScript的跳转传参方式

在JavaScript中&#xff0c;页面跳转并传递参数通常可以通过几种不同的方式来实现。下面是一些常见的方法&#xff1a; 1.URL参数&#xff08;Query String&#xff09; 这是最常见的方式&#xff0c;通过在URL的末尾添加参数来实现。例如&#xff1a; javascriptwindow.loc…

gitlab webhook触发jenkins任务

配置jenkins 安装gitlab插件 配置jenkins job 选择gitlab webhook触发 在高级中生成token 代码仓设置 新增webhook 配置webhook 测试连接 缺点&#xff0c;不能带gitLab事件的参数&#xff01;&#xff01;&#xff01;

Spark RDD案例:统计网站每月访问量

这个项目利用Spark技术&#xff0c;通过统计网站访问记录中的日期信息&#xff0c;实现了对每月访问量的统计和排序。通过分析数据&#xff0c;我们可以了解到不同月份的网站访问情况&#xff0c;为进一步优化网站内容和推广策略提供数据支持。 使用Spark统计网站每月访问量 …

Apache2.4和PHP8的量子纠缠

Apache不建议你用&#xff0c;PHP建议使用

一种基于电场连续性的高压MOSFET紧凑模型,用于精确表征电容特性

来源&#xff1a;A Compact Model of High-Voltage MOSFET Based on Electric Field Continuity for Accurate Characterization of Capacitance&#xff08;TED 24年&#xff09; 摘要 本文提出了一种新的高压MOSFET&#xff08;HV MOS&#xff09;紧凑模型&#xff0c;以消…

P5732 杨辉三角

题目描述 给出 &#x1d45b;(&#x1d45b;≤20)n(n≤20)&#xff0c;输出杨辉三角的前 &#x1d45b;n 行。 如果你不知道什么是杨辉三角&#xff0c;可以观察样例找找规律。 输入格式 无 输出格式 无 输入输出样例 输入 #1复制 6 输出 #1复制 1 1 1 1 2 1 1 3 3 …

408学习笔记-数据结构-2-线性表

线性表 1、逻辑结构 1、数据结构只有一种逻辑结构&#xff0c;而可以有两种存储结构&#xff0c;有多种抽象运算。 2、线性表是一种逻辑结构&#xff0c;属于总线性结构——线性结构的一种&#xff0c;同属于线性结构的逻辑结构还有&#xff1a;栈、队列和数组。 3、线性表定…

【经典文献】水下光学和声学成像:融合的时代?最新技术概述

文献名称&#xff1a;《Underwater Optical and Acoustic Imaging: A Time for Fusion? A Brief Overview of the State-of-the-Art》作者列表&#xff1a;Fausto Ferreira, Diogo Machado, Gabriele Ferri, Samantha Dugelay and John Potter作者单位&#xff1a;北约科学技术…

【hana】hana1.0多容器常用命令

基础命令 数据库 连接数据库 hdbsql -u system -p {passwd} -i 02 -d {dbname}查询所有数据库 SELECT DATABASE_NAME, ACTIVE_STATUS FROM M_DATABASES;停止数据库&#xff0c;会修改数据库状态为No ALTER SYSTEM STOP DATABASE testdb; 启动数据库&#xff0c;会修改数据…

多线程的代码案例

目录 单例模式 饿汉模式 懒汉模式 阻塞队列 生产者消费者模型意义: 阻塞队列使用方法 实现阻塞队列 阻塞队列实现生产者消费者模型 定时器 实现简单的定时器 工厂模式 线程池 为啥呢? 从池子里面取 比 创建线程 效率更高 线程池的创建 怎么填坑 ThreadPoolExec…

多年后,再探算法和数据结构

多年来&#xff0c;通过深入学习和实践各种编程语言&#xff0c;我对数据结构和算法在程序设计中的中心地位有了新的认识。本次从汇编语言到高级编程语言的探讨&#xff0c;展示了无论技术如何进步&#xff0c;构成程序的核心—算法和数据结构—始终保持其基础和不变的角色。 …