AtomicInteger JAVA

详解并发编程中的CAS原子类 CAS全称,是一种无锁编程算法,即比较当前的值与旧值是否相等若相等则进行修改操作(乐观锁机制),该类常用于多线程共享变量的修改操作。而其底层实现也是基于硬件平台的汇编指令,JVM只是封装其调用仅此而已。而本文会基于以下大纲展开对CAS的探讨。: 原子更新布尔类型。: 原子更新整型。AtomicLong: 原子更新长整型。 阅读详情

AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。

来看AtomicInteger提供的接口。

//获取当前的值

public final int get()

//取当前的值,并设置新的值

 public final int getAndSet(int newValue)

//获取当前的值,并自增

 public final int getAndIncrement()

//获取当前的值,并自减

public final int getAndDecrement()

//获取当前的值,并加上预期的值

public final int getAndAdd(int delta)

... ...

我们在上一节提到的CAS主要是这两个方法

    public final boolean compareAndSet(int expect, int update) {
    return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }

    public final boolean weakCompareAndSet(int expect, int update) {
    return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }

这两个方法是名称不同,但是做的事是一样的,可能在后续的java版本里面会显示出区别来。

详细查看会发现,这两个接口都是调用一个unsafe的类来操作,这个是通过JNI实现的本地方法,细节就不考虑了。

 

下面是一个对比测试,我们写一个synchronized的方法和一个AtomicInteger的方法来进行测试,直观的感受下性能上的差异

 

 
  1. package zl.study.concurrency;  
  2. import java.util.concurrent.atomic.AtomicInteger;  
  3. public class AtomicIntegerCompareTest {  
  4.     private int value;  
  5.       
  6.     public AtomicIntegerCompareTest(int value){  
  7.         this.value = value;  
  8.     }  
  9.       
  10.     public synchronized int increase(){  
  11.         return value++;  
  12.     }  
  13.       
  14.     public static void main(String args[]){  
  15.         long start = System.currentTimeMillis();  
  16.           
  17.         AtomicIntegerCompareTest test = new AtomicIntegerCompareTest(0);  
  18.         for( int i=0;i< 1000000;i++){  
  19.             test.increase();  
  20.         }  
  21.         long end = System.currentTimeMillis();  
  22.         System.out.println("time elapse:"+(end -start));  
  23.           
  24.         long start1 = System.currentTimeMillis();  
  25.           
  26.         AtomicInteger atomic = new AtomicInteger(0);  
  27.           
  28.         for( int i=0;i< 1000000;i++){  
  29.             atomic.incrementAndGet();  
  30.         }  
  31.         long end1 = System.currentTimeMillis();  
  32.         System.out.println("time elapse:"+(end1 -start1) );  
  33.           
  34.           
  35.     }  
  36. }  

 

结果

time elapse:31
time elapse:16
由此不难看出,通过JNI本地的CAS性能远超synchronized关键字

 

Reference

http://stackoverflow.com/questions/2443239/java-atomicinteger-what-are-the-differences-between-compareandset-and-weakcompar

Simulink/Requirements Toolbox 学习(一):概述 编写、导入、导出需求并使需求正式化;两种创建需求的模块:需求编辑器、需求透视;描述需求的方式:文本、图像和关键字;通过导入和导出需求文件,与第三方需求管理工具(例如 Microsoft Word、Microsoft Excel®、IBM DOORS和 IBM DOORS Next)集成。涉及模块:Requirements Eidtor、Requirements Table等; 阅读详情

相关推荐

matebookego win11 arm 系统安装安卓子系统

一般的x86电脑如果安装android子系统,运行安卓子系统,由于要将android arm代码转译为x86代码,所以效率不一定高,但是如果电脑是arm架构的,通过安卓子系统运行android的程序执行效率就会 高不少,本文参考,都是在win11 home版本下的。两者跑分在cpu上差不太多了,大约是枭龙855的水平了,这个水平的子系统就有一定的实用性了,玩个一般游戏,刷个抖音都很流畅的。启动子系统后,点击左上角的设置,启用 “开发人员模式”。然后就可以再通运运行华为应用商店来进行安装其它应用了。

babytiger的专栏 1万+

AtomicInteger

保持线程运算的原子性:一般常见的算法存在不安全行 import java.util.concurrent.atomic.AtomicInteger; atomic:提供的一些保持原子性算法: 原理解析: public final int getAndIncrement() { for (;;) { int current = get();//取出atomi...

平常心丷的博客 455

HarmonyOS开发第一步:Dev Eco Studio4.0保姆级安装配置指南(含Node.js环境)

本文提供HarmonyOS开发环境搭建的保姆级教程,重点详解Dev Eco Studio 4.0的安装与配置,并攻克Node.js环境与Ohpm包管理器的关键设置难点。通过清晰的步骤指引,帮助开发者从零开始,高效完成开发环境部署,顺利迈出鸿蒙应用开发的第一步。

lake5的博客 569

java 线程安全的全局计数器-AtomicInteger原子操作类

首先 , 测试一下正常代码 public class Test1 { public static int count = 0; public static void main(String[] args) { for (int i = 0; i &lt; 10000; i++) { new Thread() { ...

李虹柏的博客 1万+

手把手教你用srec_cat生成带CRC校验的STM32固件(解决OTA常见校验失败问题)

本文针对STM32 OTA升级中常见的固件校验失败问题,提供了一套使用srec_cat工具自动生成带CRC32校验固件的实战解决方案。文章详细拆解了命令参数,指导开发者如何为固件嵌入CRC值、处理地址偏移及合并文件,从而确保Bootloader能可靠校验固件完整性,提升远程更新的稳定性。

kappa的博客 783

大模型-高通qnn基础

提供较低级别、高度可定制的统一API,通过单独的库加速所有AI加速器核心上的AI模型, 可以直接用于针对特定的加速器核心或从流行的运行时(包括Qualcomm Neural Processing SDK、TensorFlow Lite和ONNX运行时)委派工作负载。一个支持异构计算、系统级配置的一体化SDK,旨在将AI工作负载引导到我们平台上的所有加速器核心。为开发人员提供灵活性,包括核心间协作支持和其他高级功能。是一个为训练好的神经网络模型提供高级量化和压缩技术的库。

点滴的岁月 4093

Java的多线程编程模型5--从AtomicInteger开始

AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。来看AtomicInteger提供的接口。//获取当前的值public final int get()//取当前的值,并设置新的值 pu

sunnydogzhou的专栏 3万+

毕业论文管理系统的设计与实现

毕业论文工作是高等学校本科培养阶段的一个重要环节。目前论文管理工作存在着许多问题,例如人工管理极为不便;学生对论文所要撰写的内容并不十分了解,与指导老师的沟通非常不便;老师的指导监督也很难完全到位;手工评审的效率低等。而现有的一些毕业论文信息管理或答辩评审系统只是实现了部分网上交流和评审管理的功能,在答辩评审的自测和项目指标权重等方面都存在着一定的不足。因此,本文设计的毕业论文管理系统采用B/S模式开发。其中,Browser层使用JSP技术开发;

wqq_992250277的博客 3183

Java中的AtomicInteger

Today we will look into AtomicInteger in Java. Atomic operations are performed in a single unit of task without interference from other operations. Atomic operations are necessity in multi-threaded en...

从零开始的教程世界 2065

SO_KEEPALIVE、TCP_KEEPIDLE、TCP_KEEPINTVL、保活包

是一个套接字选项,用于设置是否启用 keepalive 机制。在这段代码中没有涉及到选项的设置。当被设置为非零值时,表示启用 keepalive 机制。keepalive 是一种用于检测连接是否仍然有效的机制。通过定期发送一些特定的探测数据,可以检测到网络连接的异常中断或对端应用程序的崩溃退出。为了避免以上情况,可以启用 keepalive 机制,即使在无数据传输的情况下也定期发送探测数据。如果在一定时间内没有收到对端的响应,就认为连接已经失效,并进行相应的处理。要启用选项,需要使用函数。其中,fd。

m0_46376834的博客 4816

【异常】Claude Code 在 Windows CMD 中出现重影现象的排查与解决

Windows CMD运行Claude Code时出现文字重影、乱码等问题,原因是传统CMD对现代ANSI终端控制序列支持不足。解决方案包括:1)推荐安装Windows Terminal(完全支持ANSI标准);2)使用PowerShell 7;3)优化CMD设置(启用虚拟终端、UTF-8编码);4)关闭Claude Code视觉特效。建议优先使用Windows Terminal以获得最佳体验,这是最彻底的解决方案。其他方案仅能部分改善或缓解问题。

奶爸的编程之路,也就一周冷个三天 1961

Java并发 AtomicInteger

前言: AtomicInteger是一个专门用于以线程安全方式更新整数设计的类。 为什么我们不能简单地使用volatile int ? AtomicInteger //非线程安全计数器 volatile int public class CounterNotThreadSafe { private volatile int count = 0; public v...

湖人•总冠军 696

图文详解秋叶ComfyUI整合包开启密码访问教程(附内网穿透实战经验) ComfyUI密码、ComfyUI-Login、ComfyUI内网穿透、秋叶整合包、ComfyUI安全防护

想远程访问 ComfyUI(跨设备或公网)不希望任何人随意使用或篡改服务需要给 ComfyUI 添加登录验证机制只要按照本文教程,安装插件,并设置好用户名密码,你就能把服务加上一道强力的门槛。📌配合ngrokfrp等内网穿透工具使用公网域名推荐启用 HTTPS(SSL证书可以用宝塔/ZeroSSL 申请)密码可以设置复杂一些,定期更换更安全📬如果你在配置过程中遇到问题,欢迎评论区留言交流,或者私信我,后续我也会更新更多 ComfyUI 插件教程、安全部署经验等内容。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2732

atomicinteger java8_java8 原子类型——AtomicInteger

java8 原子类型java8 提供的包 java.concurrent.atomic 包含了许多有用的类实现原子操作。原子操作是多个线程同时执行,确保其是安全的,且并不需要synchronized 关键字。这里介绍 AtomicInteger、AtomicBoolean, AtomicLong 和 AtomicReference,这里主要演示AtomicInteger类。本质上,原子操作严重依赖...

weixin_34584910的博客 436

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

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java中AtomicInteger

1. 介绍   在Java语言中,++i和i++操作都不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。AtomicInteger,命名带有Atomic,很明显本身是原子性。这个类常是线程安全,多用于高并发对数据的修改。 2. 使用 例子 import java.util.concurrent.atomic.AtomicInteger; @Test public void use AtomicInteger() { AtomicInteger integer = new A

HachiLin的博客 913

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java atomicinteger原理_浅谈AtomicInteger实现原理

AtomicInteger位于java.util.concurrent.atomic包下,是对int的封装,提供原子性的访问和更新操作,其原子性操作的实现是基于CAS。1. CASCAS(compare-and-swap)直译即比较并交换,提供原子化的读改写能力,是Java 并发中所谓 lock-free 机制的基础。CAS的思想很简单:三个参数,一个当前内存值V、旧的预期值A、即将更新的值B,当...

weixin_35127842的博客 657

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java atomicinteger原理_AtomicInteger原理

AtomicInteger的原理java的并发原子包里面提供了很多可以进行原子操作的类,比如:AtomicIntegerAtomicBooleanAtomicLongAtomicReference等等,一共分为四类:原子更新基本类型(3个)、原子更新数组、原子更新引用和原子更新属性(字段)。、提供这些原子类的目的就是为了解决基本类型操作的非原子性导致在多线程并发情况下引发的问题。那么非原子性的操作...

weixin_35064481的博客 225

java volatile应用之 AtomicInteger

通过前一篇文章《Java Volatile》我们知道,volatile修饰的变量,线程不进行缓存,而是直接访问,但是要想保证多线程访问该变量时,线程安全,只有满足条件:操作是原子; 上篇中的i++,就是例子,他不是一个原子操作,所以不能保证多线程同时访问变量时,值的正确性; 本篇文章主要介绍 AtomicInteger的提供的访问方法和为什么它没有使用synchronized关键字也能

行者无疆 1838

Java AtomicInteger的用法

1java.util.concurrent.atomic 的包里有AtomicBoolean, AtomicInteger,AtomicLong,AtomicLongArray, AtomicReference等原子类的类,主要用于在高并发环境下的高效程序处理,来帮助我们简化同步处理. 在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键...

lonely_bin的博客 341

JAVA学习-AtomicInteger

本文主要介绍在java实际开发过程中遇到的AtomicInteger类使用,希望可以给一些小伙伴带来帮助。AtomicInteger类是具有原子性的对于Integer进行操作工具类。它通过Unsafe保证了原子性,提供了很多对值进行比较和交换的方法,参考CAS原理。后续本文会补充上述各方法的样例代码及使用场景,尽可能的通过该类的底层实现原理更深入的理解它,同时可以学习多线程并发场景下的一些相关知识。

javaYanKang的博客 4432

Java AtomicInteger 原理

Java AtomicInteger 原理 AtomicInteger是一个支持原子操作的int封装类,提供了原子性的访问和更新操作 其底层是通过volatile和CAS实现的,其中volatile保证了内存可见性,CAS算法保证了原子性 volatile volatile是用于保证可见性的关键字,当变量被声明为volatile后,每次操作该变量都会强制将修改的值立即写入主存 在AtomicInt...

提辖鲁的博客 2063

java对atomicinteger加锁_Java AtomicInteger类使用方法实例讲解

1、java.util.concurrent.atomic 的包里有AtomicBoolean, AtomicInteger,AtomicLong,AtomicLongArray,AtomicReference等原子类的类,主要用于在高并发环境下的高效程序处理,来帮助我们简化同步处理.在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字...

weixin_29048775的博客 474

Java原子类 AtomicInteger

其中 CAS 算法是一种无锁同步机制,核心思想是 “先比较后更新”:它包含三个操作数 —— 内存地址 V、预期值 A、新值 B,当且仅当内存地址 V 中的值等于预期值 A 时,才将 V 的值更新为 B,否则不做任何操作,整个过程是原子性的。其中 get() 和 decrementAndGet() 都是不可被打断的原子操作,但这种写法存在明显的逻辑缺陷:虽然单个操作是原子的,但两个操作之间的间隙仍可能被其他线程打断,从而导致线程安全问题并引发票号错乱。新值 B(线程希望将内存值更新为的值)。

zjr060330的博客 720

初探Java Atomic包之AtomicInteger

这个包里有很多类 这里就先看个我常用的类 AtomicInteger,操作int数据 用到了Unsafe类,这个类可以直接访问系统内存资源,所以不安全。一般不开放给用户,对于getUnsafe方法,只开放给系统主加载器。 这个类还有个关键的变量就是valueOffset,用反射和Unsafe类方法拿到了“value”的偏移地址。 **************************AtomicInteger 类************************************* public cla

这个妖姬有点秀 311

详解java并发原子类AtomicInteger

java并发包里面的类一直是学习和面试的重点,这篇文章主要是对java并发包的其中一个类AtomicInteger的讲解。从为什么要出现AtomicInteger再到其底层原理来一个分析。 一、从a++说起为什么使用AtomicInteger 我们知道java并发机制中主要有三个特性需要我们去考虑,原子性、可见性和有序性。synchronized关键字可以保证可见性和有序性却无法保证原子性。而这个AtomicInteger的作用就是为了保证原子性。我们先看一个例子。 //定义一个变量a

唐僧洗发用飘柔 366
上一篇: Oracle中的索引详解
下一篇: Vim 教程经典入门
lb8607
博客等级 码龄18年 17粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值