AtomicInteger的分析使用

jdk线程池ThreadPoolExecutor工作原理解析(自己动手实现线程池) 在日常开发中经常会遇到需要使用其它线程将大量任务异步处理的场景(异步化以及提升系统的吞吐量),而在使用线程的过程中却存在着两个痛点。在java等很多主流语言中每个逻辑上的线程底层都对应着一个系统线程(不考虑虚拟线程的情况)。操作系统创建一个新线程是存在一定开销的,在需要执行大量的异步任务时,如果处理每个任务时都直接向系统申请创建一个线程来执行,并在任务执行完毕后再回收线程,则创建/销毁大量线程的开销将无法忍受。每个系统线程都会占用一定的内存空间,且系统在调度不同线程上下文切换时存在一定的cpu开销。 阅读详情

测试方法

private static AtomicInteger atomic = new AtomicInteger(0);
    private static int dex = 0;
    public static void main(String args[]){
        testAtomic();
//      testInt();
    }

    private static void testAtomic(){
        ExecutorService exe = Executors.newFixedThreadPool(5);//线程池
        for(int i=0;i<10000;i++){
            exe.execute(new Runnable(){

                @Override
                public void run() {
                    for(int j=0;j<4;j++){
                        System.out.println(atomic.getAndIncrement());
                    }

                }

            });
        }
        exe.shutdown();

    }

    private static void testInt(){
        ExecutorService exe = Executors.newFixedThreadPool(5);
        for(int i=0;i<10000;i++){
            exe.execute(new Runnable(){
                @Override
                public void run() {
                    for(int j=0;j<4;j++){
                        System.out.println(++dex);
                    }
                }});
        }
        exe.shutdown();   
    }

最终发现 testAtomic能够正确计算出结果,testInt就存在一定的误差。

方法对比说明,其中由于atomicInteger的原子性,没有在加synchronized 的情况下。能够计算准确。并且其比synchronized的性能好很多。所以特别适合高并发的情况。incrementAndGet与getAndIncrement 就对比为 ++i和i++;
ExecutorService的shutdown和shutdownNow方法 。第一个是在线程池终止前允许执行 之前提交的任务。 shutdownNow 会尝试停止正在执行的任务。不去执行正在等待的任务。 总的来说当使用到多线程的时候 atomicInteger是个不错的选择

【Flutter 问题系列第 85 篇】Xcode 运行 Flutter 提示 The Dart VM Service was not discovered after 60 seconds. 在 Xcode 上运行 Flutter 时提示 `The Dart VM Service was not discovered after 60 seconds. This is taking much longer than expected...`,意思是 `60秒后未发现Dart虚拟机服务。这比预期的要长得多` 阅读详情

相关推荐

告别IMEI!手把手教你用UUID实现Android设备唯一标识(兼容Android 10-13)

本文详细探讨了在Android 10及以上版本中,如何构建合规且高可用的设备唯一标识方案以替代被限制访问的IMEI。文章深入分析了Android设备标识符的演变,并提供了基于UUID/GUID的完整实现策略,包括生成算法、多级持久化存储方案(如MediaStore)、权限处理以及版本兼容性实践,帮助开发者应对Android 10-13的隐私政策变化。

weixin_28339967的博客 574

ThreadPoolExecutor源码分析

一、线程和任务的概念 首先区分概念,任务和线程。可以简单理解为任务为Runnable,线程为Thread。ThreadPoolExecutor内部维持的是线程池,因为创建线程比较耗时耗资源。而内部维护任务使用的是BlockingQueue。 二、ThreadPoolExecutor源码 2.1 ctl变量 private final AtomicInteger ctl = ...

meser88的博客 1044

深度学习环境搭建:CUDA、Anaconda、PyTorch 完整安装与验证教程

步骤操作验证命令1安装 CUDA 工具包nvcc -V2安装 Anaconda3创建 yolo 环境4安装 PyTorch5验证 GPU。

qq_37606844的博客 321

Qt 原子操作的类QAtomicInteger

Class Blog QAtomicInteger Class The QAtomicInteger class provides platform-independent atomic operations on integers.More... Header: #include

lxj434368832的博客 1万+

KiCad自动布线实战:FreeRouting插件安装与使用指南

在PCB设计流程中,布线环节往往占据大量重复性工作,尤其对于中小型双面板,成百上千条飞线的手动连接既繁琐又易出错。自动布线技术通过算法在给定设计规则和元件布局的基础上自动规划走线路径,能显著提升布线效率。FreeRouting作为一款开源自动布线器,与KiCad通过DSN/SES标准中间格式无缝配合,让工程师将精力集中于关键信号和布局优化,而将常规网络交给工具处理。本文从自动布线的原理与边界出发,讲解了FreeRouting的安装、DSN导出、参数设置、自动布线及结果回传的完整流程,并结合实际案例展示了在S

weixin_32025789的博客 278

RK3588部署Zipformer模型问题总结

本文分享了在RK3588嵌入式设备上部署小米Zipformer语音识别模型时遇到的问题及解决方法。主要遇到两个问题:1)在rknn_model_zoo例程编译时出现静态库版本不兼容,通过重新编译kaldi-native-fbank库并修改链接路径解决;2)sherpa-onnx编译时提示缺少portaudio库,通过修改编译脚本启用相关宏定义后成功编译。最终成功在RK3588上运行Zipformer模型,测试结果显示该模型具有较好的识别效果和实时性(RTF=0.22),验证了其在边缘设备上的适用性。

pkyang2004的博客 2145

AtomicInteger使用详解

AtomicInteger是Java中提供的一种线程安全的原子操作类,用于在多线程环境下对整数进行原子操作。

qq_39939541的博客 5207

精度0.01%决定续航多20km|新能源汽车研发测试:功率分析仪到底有多硬核?

新能源汽车测试、功率分析仪、电驱系统、效率MAP、谐波THD、GB/T18488、CLTC工况、三电测试、台架标定、能量流分析。中的核心作用,用公式、思维导图、实战金句与避坑指南,帮研发测试人员把准数据、提效率、降返工,看完就能落地用。点击关注,进公众号主页查看历史文章,**台架接线图、效率MAP模板、GB/T18488测试清单等。优化弱磁/调制策略,高效区占比提升5%,CLTC续航直接+8~20km。同样工况,两次数据差0.8%,报告根本没法交。结果:数据飘、定位慢、反复返工、认证不过。

优快云-新能源汽车研发测试专业博主 170

【翻译】Qt线程概述

一、关于线程 线程的用途:单个进程内的并发。 1.1、单核CPU 在单核 CPU 上并行工作是一种错觉。对于进程,这种错觉是通过在很短的时间后中断处理器对一个进程的工作而产生的。然后处理器继续下一个过程。为了在进程之间切换,保存当前程序计数器并加载下一个处理器的程序计数器;对寄存器和某些体系结构和操作系统特定数据进行处理。 正如一个 CPU 可以驱动两个或多个进程一样,也可以让 CPU 在一个进程的两个不同代码段上运行。当一个进程启动时,它总是执行一个代码段,该进程被称为主线程。程序可能会决定启动第

友善啊,朋友的博客 1813

YOLOv8改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合

可扩展的高效物体检测BiFPN(加权双向特征金字塔网络)

Limiiiing的博客 1082

手把手教你从入门到精通C# MES通信

本文是C#与MES通信通信的目录,使用C#与各种MES系统通信的方法我都会在专栏中讲到,比如WebService、Http、Ftp、共享文件夹、串口通信等,绝对是上位机软件工程师实现与MES系统通信的必备教程!

qq_34059233的博客 8750

AtomicInteger源码分析

前言   AtomicInteger使得在高并发的场景下,可以安全的操作整数的增减。主要原理是采用Unsafe.CAS操作。 原子操作类   多线程同时对int i进行操作,可能导致原子性问题。   可以加Synchronized悲观锁解决,考虑到性能问题,JDK1.5后,J.U.C包提供Atomic包 → 对常用数据结构做原子操作。   J.U.C中的原子操作类有: 原子基本类型 Atomi...

JeremyJiaming的博客 373

MATLAB - 利用非线性模型预测控制(Nonlinear MPC)来控制四旋翼飞行器

本示例展示了如何利用非线性模型预测控制(MPC)为四旋翼飞行器设计一个跟踪轨迹的控制器。

机器人控制与仿真应用 4432

从自定义AtomicInteger到其源码分析

通过自定义AtomicInteger可以帮助我们理解其源码首先,我们想达到的目的是能够完成一个保证在不使用synchronized关键字的情况下,保证对int的操作安全;大致代码思路如下: 根据上述思路编写大致代码如下: 编写测试代码 可以观察到测试结果正常;先观察AtomicInteger的结构,红框部分是此次分析主要部分; 可以观察到,同样AtomicInteger对int的操作同样是用volitile封装的,保证可见性;同时也用valueOffset存储了在对象中int属性的偏移量; 从源码分析

qq_40988139的博客 297

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java——》AtomicInteger源码分析

Java——》AtomicInteger源码分析

小仙~ 630

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

AtomicInteger源码分析总结

AtomicInteger源码分析1,简介       AtomicInteger 是一个支持原子操作的 Integer 类,就是保证对AtomicInteger类型变量的增加和减少操作是原子性的,不会出现多个线程下的数据不一致问题。如果不使用 AtomicInteger,要实现一个按顺序获取的 ID,就必须在每次获取时进行加锁操作,以避免出现并发时获取到同样的 ID 的现象。2,知识补充(有助于...

技术成就人生 629

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

AtomicInteger 源码分析阅读

​     序 阅读java源码可能是每一个java程序员的必修课,只有知其所以然,才能更好的使用java,写出更优美的程序,阅读java源码也为我们后面阅读java框架的源码打下了基础。阅读源代码其实就像再看一篇长篇推理小说一样,不能急于求成,需要慢慢品味才行。这一系列的文章,记录了我阅读源码的收获与思路,读者也可以借鉴一下,也仅仅是借鉴,问渠那得清如许,绝知此事要躬行!要想真正的成为大...

qianfeng_dashuju的博客 328

JDK AtomicInteger 源码分析

@(JDK)[AtomicInteger] JDK AtomicInteger 源码分析 Unsafe 实例化 Unsafe在创建实例的时候,不能仅仅通过new Unsafe()或者Unsafe.getUnsafe()来获取,因为Java会进行安全校验,只有信任的代码,才能够获取实例。 @CallerSensitive public static Unsafe getUnsafe() {...

diaoxie6172的博客 126

AtomicInteger、AtomicLong、LongAdder的性能问题及源码分析

1、AtomicInteger 这里主要看incrementAndGet方法 可以看出,AtomicInteger的累加方法使用了unsafe中的getAndAddInt方法(这里的U是jdk.internal.misc.Unsafe类) AtomicInteger之所以使用unsafe进行数据累加而不适用volatile,就是因为volatile不能保证数据的原子性,而unsafe可以。我们看到,unsafe中的累加方法是通过CAS实现的,多线程并发时,同时只会有一个修改成功,其它的线程会

qq_42949615的博客 1993

JDk8 AtomicInteger源码分析 CAS

JDk8 AtomicInteger源码分析 CAS AtomicInteger的使用场景 AtomicInteger源码分析 CAS 我们知道在进行i=i+1或者i++、++i操作时是线程不安全的。 下面展示代码 i=i+1 public class MainTest { private Integer count=0; public void add() { count++; } } 经过javap的编译如下: "Java\jdk1.8.0_

xxxz123的专栏 439

JDK源码分析-AtomicInteger

  AtomicInteger可以看做Integer类的原子操作工具类。在java.util.concurrent.atomic包下,在一些使用场合下可以取代加锁操作提高并发性。接下来就从几个方面来介绍:   1.原子性和CAS。   2.CPU底层实现原理。   3.atomic包介绍。   4.源码分析。   原子性和CAS   原子性就是指某一个操作是不可拆分的,是一个整体必须要...

weixin_34290631的博客 187

死磕 java并发包之AtomicInteger源码分析

问题 (1)什么是原子操作? (2)原子操作和数据库的ACID有啥关系? (3)AtomicInteger是怎么实现原子操作的? (4)AtomicInteger是有什么缺点? 简介 AtomicInteger是java并发包下面提供的原子类,主要操作的是int类型的整型,通过调用底层Unsafe的CAS等方法实现原子操作。 还记得Unsafe吗?点击链接直达【死磕 java魔法类之Unsafe解...

彤哥读源码 317
上一篇: Gradle超级详细解析
下一篇: android仿支付宝首页更多、应用编辑界面
pretty_boy1
博客等级 码龄10年 471粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值