JAVA原子类

Java中高级核心知识全面解析——Atomic(什么是Atomic原子类、基本类型原子类、数组类型原子类、引用类型原子类?) 一、Atomic 原子类介绍 Atomic翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。 所以,所谓原子类说简单点就是具有原子/原子操作特征的类。 并发包java.util.concurrent的原子类都存放在java.util.concurrent.atomic下,如下图所示。 根据操作的数据类型,可以将JUC包中的原子类分为4 阅读详情

Java 原子类概述

Java 提供了一系列原子类,位于 java.util.concurrent.atomic 包中,用于在多线程环境下实现无锁的线程安全操作。这些类基于 CAS(Compare-And-Swap)机制,避免了传统锁的开销,适用于高并发场景。


基本类型原子类

AtomicBoolean

提供原子性的布尔值操作,如 compareAndSet、getAndSet 等。

AtomicBoolean flag = new AtomicBoolean(true);
flag.compareAndSet(true, false); // 原子更新

AtomicInteger

支持原子性的整型操作,如自增、加法等。

AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet(); // 原子自增

AtomicLong

功能类似 AtomicInteger,但针对长整型数据。

AtomicLong counter = new AtomicLong(0L);
counter.addAndGet(10L); // 原子加法


引用类型原子类

AtomicReference

对普通对象引用进行原子操作。

AtomicReference<String> ref = new AtomicReference<>("initial");
ref.compareAndSet("initial", "updated");

AtomicStampedReference

解决 ABA 问题,通过版本号(Stamp)标记引用变化。

AtomicStampedReference<String> stampedRef = 
    new AtomicStampedReference<>("A", 0);
int[] stampHolder = new int[1];
String value = stampedRef.get(stampHolder); // 获取值和版本号

AtomicMarkableReference

类似 AtomicStampedReference,但用布尔标记代替版本号。

AtomicMarkableReference<String> markedRef = 
    new AtomicMarkableReference<>("data", false);


数组原子类

AtomicIntegerArray

原子操作整型数组中的元素。

AtomicIntegerArray array = new AtomicIntegerArray(10);
array.getAndIncrement(0); // 原子递增数组第0个元素

AtomicLongArray

类似 AtomicIntegerArray,但针对长整型数组。

AtomicLongArray longArray = new AtomicLongArray(10);
longArray.addAndGet(0, 100L);

AtomicReferenceArray

原子操作对象引用数组。

AtomicReferenceArray<String> refArray = 
    new AtomicReferenceArray<>(10);
refArray.set(0, "value");


字段更新原子类

AtomicIntegerFieldUpdater

基于反射原子更新类的整型字段。

class MyClass { volatile int value; }
AtomicIntegerFieldUpdater<MyClass> updater = 
    AtomicIntegerFieldUpdater.newUpdater(MyClass.class, "value");
MyClass obj = new MyClass();
updater.set(obj, 100);

AtomicLongFieldUpdater

类似 AtomicIntegerFieldUpdater,针对长整型字段。

AtomicLongFieldUpdater<MyClass> longUpdater = 
    AtomicLongFieldUpdater.newUpdater(MyClass.class, "longValue");

AtomicReferenceFieldUpdater

原子更新对象的引用类型字段。

AtomicReferenceFieldUpdater<MyClass, String> refUpdater = 
    AtomicReferenceFieldUpdater.newUpdater(MyClass.class, String.class, "field");


高性能累加器

LongAdder 与 DoubleAdder

适用于高并发统计场景,比 AtomicLong 更高性能。

LongAdder adder = new LongAdder();
adder.add(10);
long sum = adder.sum();

LongAccumulator 与 DoubleAccumulator

支持自定义累加规则(如取最大值)。

LongAccumulator accumulator = new LongAccumulator(Long::max, 0L);
accumulator.accumulate(100); // 保留最大值


使用场景建议

  1. 计数器场景:优先使用 LongAdder 替代 AtomicLong。
  2. 对象引用更新:需解决 ABA 问题时选择 AtomicStampedReference。
  3. 字段原子更新:使用 AtomicXXXFieldUpdater 减少内存占用。

通过合理选择原子类,可以显著提升并发程序的性能和可靠性。

RH850系列芯片深度剖析 1.5-链接(ld)文件解析 基础编译过程分为四个阶段:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)。执行这四个阶段的程序(预处理器、编译器、汇编器、和链接器)一起构成了编译系统。CONSTANTS接下来的内存空间定义部分会使用这些常量来定义内存空间的范围,理论上来说不定义常量也没有影响,直接用魔鬼数字代替,定义常量的主要目的就是方便理解以及方便修改;从示例中可以看出,常量的值可以为16进制或者10十进制,而且10进制支持数量级单位(k级,M级); 阅读详情

相关推荐

深入探索前端调试神器vConsole

vConsole作为一款前端调试神器,为前端开发者提供了一个便捷的调试解决方案。通过本文的介绍和示例,相信你已经对vConsole有了更深入的了解。然而,vConsole的功能远不止于此,它还有许多高级用法和技巧等待你去发掘。讨论:你在前端开发中是如何使用vConsole的?你有没有发现vConsole的一些隐藏功能或技巧?欢迎在评论区分享你的经验和见解!💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 8524

那些Java中原子类的使用

对java原子类的总结,方便以后回看

机智的爆爆哥 1324

使用BK3432芯片进行蓝牙开发的详细指南:编程手册与实际应用

BK3432是一款蓝牙4.2双模式芯片,支持蓝牙低功耗(BLE)和经典蓝牙(BR/EDR)模式。它集成了高性能的RF收发器、基带处理器、ARM9E内核、丰富的功能外设单元,并支持BLE应用的可编程协议和概要文件。蓝牙版本:4.2数据速率:最高支持2Mbps内核:ARM9ERF收发器:高性能、低功耗外设单元:包括UART、SPI、I2C、GPIO等功耗:超低功耗设计,适合电池供电的应用。

m0_57781768的博客 4453

Java原子类实现原理分析

并发包中的原子类可以解决类似num++这样的复合类操作的原子性问题,相比锁机制,使用原子类更精巧轻量,性能开销更小,下面就一起来分析下原子类的实现机理。 悲观的解决方案(阻塞同步)   我们知道,num++看似简单的一个操作,实际上是由1.读取 2.加一 3.写入三步组成的,这是个复合类的操作(所以我们之前提到过的volatile是无法解决num++的原子性问题的),在并发环境下,...

dimei8552的博客 603

Zemax中场曲与畸变图的深度解析与应用场景对比

本文深度解析了Zemax中场曲/畸变图与网格畸变图的核心原理、计算逻辑与适用场景。通过对比常规成像镜头、扫描镜头、鱼眼镜头及变形宽银幕镜头等实际案例,详细阐述了如何根据系统对称性、视场角及核心需求选择正确的分析工具与畸变评价标准,为光学设计中的畸变诊断与优化提供清晰指导。

sand8的博客 482

stc8g1k08硬件iic读取aht20温湿度及0.91寸oled显示

使用stc8g1k08读取aht20温湿度及0.91寸oled显示。

qq_61688416的博客 2772

Java中的原子操作类

Java从JDK 1.5开始提供了java.util.concurrent.atomic包,这个包中的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式.Atomic包里的类基本都是使用Unsafe实现的包装类 1.原子更新基本类型类 AtomicBoolean:原子更新布尔类型。 AtomicInteger:原子更新整型 AtomicLong:原子更新长整型 以AtomicInteger为例: int addAndGet(int delta):以原子方式将输入的数值与实例中的值(A

阿璐4r的博客 379

睿尔曼超轻量仿人机械臂--PLC控制

PLC通过以太网与机械臂创建socket连接,PLC发送JSON协议控制机械臂进行物料抓取。

weixin_61488836的博客 2464

Java中常用的原子类

文章目录一、什么是原子类二、原子类的底层实现三、常用的原子类3.1、AtomicInteger与AtomicLong3.2、LongAdder四、原子类的性能测试4.1、测试程序4.2、测试结果4.3、结果分析4.4、底层实现分析 一、什么是原子类 Java中提供了一些原子类,原子类包装了一个变量,并且提供了一系列对变量进行原子性操作的方法。我们在多线程环境下对这些原子类进行操作时,不需要加锁,大大简化了并发编程的开发。 二、原子类的底层实现 目前Java中提供的原子类大部分底层使用了CAS锁(Compar

weixin_43364551的博客 7593

GEE:大面积研究区域数据分块导出,以解决内存限制和导出失败的问题

本文介绍了在Google Earth Engine (GEE)平台分块导出大面积研究区域数据的方法。针对直接导出大区域影像易失败的问题,作者提出通过网格分块技术进行处理。文章展示了完整的JavaScript代码示例,包含定义研究区域、加载ESA WorldCover数据集、设置分块参数(包括像素大小、分块尺寸)、创建网格系统、处理坐标转换等关键步骤。代码中还提供了错误处理和导出按钮功能,确保数据能可靠地分块导出到Google Drive。该方法有效解决了大区域数据导出时的内存限制问题,适用于全球范围的研究。

养乐多的博客 1187

路径跟踪 | 图解路径跟踪PID算法(附ROS C++/Python/Matlab仿真)

PID控制是一种经典的控制算法,广泛应用于各种工业场景。在基于PID的局部路径规划中,希望机器人能快速跟踪上预设的轨迹。本文介绍PID控制的基本原理,并基于PID控制律设计路径跟踪算法,最后通过ROS C++/Python/Matlab进行仿真实现,加深理解

FRIGIDWINTER的博客 1万+

java 原子类

Java 并发包中的原子类都是基于无锁方案实现的(CAS),相较于传统的互斥锁,无锁并没有加锁、解锁、线程切换的消耗,因此无锁解决方案的性能更好,同时无锁还能够保证线程安全。 java原子类预览 AtomicInteger 示例 package com.zhang.myjuc.a4.atomic; import java.util.concurrent.atomic.AtomicInteger; /** * AtomicIntegerDemo:演示AtomicInteger的基本用法,对比

长草颜团子 6847

华为OD机试真题 新系统【Skill执行链完整性检测】

华为OD机试 新系统真题【Skill执行链完整性检测】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【Skill执行链完整性检测】

qq_45776114的博客 765

java原子类

在JDK 8中新增了LongAdder 、DoubleAdder类,Adder中引入了分段累加的概念,内部的Cell[]数组和base变量都参与了计数。其中base在竞争不激烈的情况下,直接把累加的结果改到base变量上。在竞争激烈的时候,各个线程会分散累加到自己所对应的Cell[] 数组的某一个对象中,而不是公用一个。LongAdder这样分段的思想将不同线程到不同Cell上的修改,避免了大量的冲突,提升了并发性。跟JDK 7 中的ConcurrentHashMap思想相似。

游王子og的博客 1580

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java原子类详解

java原子类详解 什么原子类 原子类是具有原子性的类,原子性的意思是对于一组操作,要么全部执行成功,要么全部执行失败,不能只有其中某几个执行成功。 原子类作用 作用和锁有类似之处,是为了保证并发情况下的线程安全。 相对于锁的优势 粒度更细 原子变量可以把竞争范围缩小到变量级别,通常情况下锁的粒度也大于原子变量的粒度 效率更高 除了在高并发之外,使用原子类的效率往往比使用同步互斥锁的效率更高,因为原子类底层利用了CAS,不会阻塞线程。 原子类种类 在JDK中J.U.C包下提供了种类丰富的原子类,

yetaoii的博客 9317

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java中的原子类

送你小心心记得关注我哦!在前面的内容中,我们已经学习了CAS的原理,所以对于学习本节来说会非常容易。本节介绍Java中的原子类是java.util.concurrent.atomic包下...

晏霖/胖虎的博客 2534

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java原子类详解

原子类通过CAS机制实现无锁线程安全操作,比同步锁性能更高。主要包括基本类型(AtomicInteger/AtomicLong/AtomicBoolean)和引用类型(AtomicReference/AtomicStampedReference)原子类。核心原理是CAS(Compare-And-Swap)操作,通过比较内存值、预期值和新值实现原子更新。AtomicStampedReference通过版本号解决ABA问题,即在值从A变B又变回A时仍能正确判断变更。

编程技术圈 1474

Java16个原子类介绍

关于原子类个数说明 在JDK7包括7之前,java原子类有12个,图片如下 在JDK8时出现了4个原子操作类,分别是如下图片所示 原子更新基本类型类 使用原子的方式更新基本类型,Atomic包提供了以下3个类。 AtomicBoolean: 原子更新布尔类型。 AtomicInteger: 原子更新整型。 AtomicLong: 原子更新长整型。 以上3个类提供的方法几乎一模一样,以AtomicInteger为例进行详解,AtomicIngeter的常用方...

GSON的博客 8268

Java16个原子类介绍-基于JDK8

前言 emmmm,在写文章前我也翻阅了好多资料和书籍,其实大家在对原子类方法的使用介绍基本都没问题,但是对于java中原子类的个数是五花八门,下面我就把自己都认知和书籍资料结合起来给大家简单都介绍下java中原子类的应用。 参考文献 《Java并发编程的艺术》 正文 关于原子类个数说明 在JDK7包括7之前,java原子类有12个,图片如下,有些资料说有13个,多出来的是 Atomic...

晏霖/胖虎的博客 2万+

java的原子类_Java 原子类的使用及原理分析

前面两篇文章,一篇文章我们介绍了Unsafe中的CAS,另一篇文章介绍了volatile语义及其实现,再来学习今天的Java原子类可以说是水到渠成。再简单回顾一下Unsafe中CAS——该操作通过将内存中的值与指定数据进行比较,当数值一样时将内存中的数据替换为新的值;至于volatile则提供了可见性(每次读写都可以拿到最新值)和重排序限制。1.atomic包介绍在java.util.concur...

weixin_30895059的博客 877

Java原子类

引言 Java的原子类涉及到了多线程,一般情况下遇到多线程考虑的第一个问题就是如何保证共享数据的安全性。java的synchronized还是锁以及其他的线程安全的数据结构,其实都是为了解决这个问题。原子类也是为了解决这个问题 java提供了无锁的基于高级机器指令的安全的类,以实现数据操作的原子性,这就是Java并发包中的原子类。(java.util.concurrent.atomic) 相比较于传统的互斥锁,无锁不存在加锁、解锁、线程切换的消耗,无锁的性能比较好,同时也能保证线程的安全性。 作为原子类,最

a_un_l的博客 366

Java基础-Atomic原子类

/枚举类//1.提供类的属性,声明为private final//2.声明为final的属性,在构造器中初始化。//3.通过公共的方法来调用属性//4.创建枚举类的对象:将类的对象声明public static finalpublic static final Season SPRING = new Season("spring", "春暖花开");

qq_45477639的博客 1679
上一篇: 并发编程笔记1
下一篇: JAVA线程安全类
xuhaoyu_cpp_java
博客等级 码龄2年 2粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值