AtomicInteger的使用(高并发)

SkyWalking跨线程Trace传递实战:手把手教你用RunnableWrapper解决异步链路中断问题 本文深入解析了SkyWalking在异步编程场景下链路追踪中断的根源,并提供了使用RunnableWrapper等官方包装类的实战解决方案。通过详细的原理解析和代码示例,手把手指导开发者如何实现跨线程的Trace传递,确保分布式系统监控链路的完整性,有效解决异步任务导致的链路中断问题。 阅读详情

AtomicInteger的使用(高并发)

普通代码处理高并发,对count进行++操作:

public class MyAtomicInteger {
    private static final Integer threadCount = 20;
    private static Integer num = 0;
    private static void increase() {
        num++;
    }

    public static void main(String[] args) {
        Thread[] threads = new Thread[threadCount];
        for (int i = 0; i < threadCount; i++) {
            threads[i] = new Thread(() -> {
                for (int i1 = 0; i1 < 2000; i1++) {
                    increase();
                }
            });
            threads[i].start();
        }
        while (Thread.activeCount() > 1) {
//            意思就是调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程。它跟sleep方法类似,同样不会释放锁。
//            但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会。
//            注意调用yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,这一点是和sleep方法不一样的
            Thread.yield();
        }
        System.out.println(Thread.currentThread().getName());
        System.out.println("num:" + num);
    }
}

运行结果如下:

main
num:36939

正确值应该是40000,但是少了,说明我们的代码有问题
加上volatile修饰count:

public class MyAtomicInteger {
    private static final Integer threadCount = 20;
    private static volatile Integer num = 0;
    private static void increase() {
        num++;
    }

    public static void main(String[] args) {
        Thread[] threads = new Thread[threadCount];
        for (int i = 0; i < threadCount; i++) {
            threads[i] = new Thread(() -> {
                for (int i1 = 0; i1 < 2000; i1++) {
                    increase();
                }
            });
            threads[i].start();
        }
        while (Thread.activeCount() > 1) {
//            意思就是调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程。它跟sleep方法类似,同样不会释放锁。
//            但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会。
//            注意调用yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,这一点是和sleep方法不一样的
            Thread.yield();
        }
        System.out.println(Thread.currentThread().getName());
        System.out.println("num:" + num);
    }
}

结果还是差强人意,结果如下:

main
num:39490

这个时候引入java并发包下的AtomicInteger类,利用其原子操作实现高并发问题解决,代码如下:

public class MyAtomicInteger {
    private static final Integer threadCount = 20;
    private static AtomicInteger count = new AtomicInteger(0);
    private static void increase() {
        count.incrementAndGet();
    }

    public static void main(String[] args) {
        Thread[] threads = new Thread[threadCount];
        for (int i = 0; i < threadCount; i++) {
            threads[i] = new Thread(() -> {
                for (int i1 = 0; i1 < 2000; i1++) {
                    increase();
                }
            });
            threads[i].start();
        }
        while (Thread.activeCount() > 1) {
//            意思就是调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程。它跟sleep方法类似,同样不会释放锁。
//            但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会。
//            注意调用yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,这一点是和sleep方法不一样的
            Thread.yield();
        }
        System.out.println(Thread.currentThread().getName());
        System.out.println("num:" + count);
    }
}

运行结果:

main
num:40000

可见实现了对高并发情况下问题的解决!

实现原理:
利用cas原理,在主存中有一V值,线程在进入的时候会获取到V值,在进行更新的时候,会把自己获取到的V值和主存的V值进行比较,如果相等就进行更新操作,然后返回V的旧值,避免重复更新操作。同时和之前线程同时进来的线程获取的V值就不等于之前线程更新后主存中的V值了,就不能实现更新操作。但是,会利用while循环
while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4)); 不断地把主存中的V值更新成自己的V值,当相等的时候,实现更新操作,从而解决高并发问题。这就是无锁环境下的并发控制,效率高于qas锁,称为乐观锁。。

以上是博主的学习过程,如有不妥之处,望指正!!!!!

【BIM入门实战】Revit创建地形的几种方法及优缺点 Revit在体量和场地选项卡的【地形表面】工具可以创建三维地形,有三种方法:放置点、指定点文件和导入实例文件、倾斜摄影点云技术和InfraWorks地形生成。 文章目录1. 放置点2. 指定点文件3. 导入实例文件4. 倾斜摄影点云技术5. InfraWorks地形生成 1. 放置点 放置点功能位于体量和场地选项卡下地形表面,点开找到放置点,并通过自定义设置点的高程值来创建地形的高程数据。 优点:通过用户自定义高程点来绘制模型,使地形更为精确。 缺点:只适用于面积小的项目,面积太大,人工效率低下。 . 阅读详情

相关推荐

低电压高效率能源管理芯片BQ25570的基本用法及应用电路实例

BQ25570是一款低电压、高效率、集成了可编程功率追踪(MPPT)功能、BOOST升压功能和BUCK降压功能的综合型能源管理电路。冷启动工作电压为330mV,热启动工作电压为100mV。主要应用于温差发电片TEG、压电、摩擦发电和太阳能板的能量收集,也可以用于人体可穿戴自取能传感设备的能量管理。本文主要介绍了BQ25570相关参数计算、MPPT功能验证、工作逻辑和应用场景,并设计了一版测试电路,给出了不同应用需求的电路配置建议。

weixin_49213602的博客 3450

Java-多线程之线程池是否需要关闭

Jmeter压力测试 背景 之前的文章Java—多线程之学了就要用-CountDownLatch中,用线程池处理相关业务的功能代码,在程序处理完毕后,线程池并未关闭,后来review代码的时候发现了这个问题,将线程池关闭。 上线之前通过jmeter进行压力测试。对比线程池关闭和不关闭时压力测试的情况。下面通过测试数据进行对比。 测试 核心代码 @RestController @RequestMapping("tbgl/tbjd") public class TbjdController { /*

李小白的博客 3567

ISP Tuning实战:从零开始调校相机传感器的完整流程(附避坑指南)

本文详细介绍了ISP Tuning的完整实战流程,即如何从零开始调校相机传感器以优化成像质量。内容涵盖从黑电平校正、镜头阴影校正等基础标定,到自动曝光、伽马校正、色彩校正等核心画质调校,再到降噪与锐化的平衡策略,并提供了关键的避坑指南。掌握ISP Tuning是提升相机传感器性能、实现从‘能用’到‘好用’的关键技术。

weixin_32098457的博客 196

AtomicInteger的底层实现原理

一、AtomicInteger的底层实现原理 AtomicInteger是对int类型的一个封装,提供原子性的访问和更新操作,其原子性操作的实现是基于CAS(compare-and -swap)技术。 二、CAS CAS算法的过程是这样的,它包含三个参数CAS(V,E,N)。V表示要更新的变量,E表示预期值,N表示新值。仅当V值等于E值时,才会将V的值设为N。如果V值和E值不同,说明已经有了...

Tyella的博客 6002

工业自动化中气动夹爪选型、调试与维护全流程实战解析

在工业自动化领域,气动执行元件是实现精准抓取与搬运的基础。其工作原理是通过压缩空气驱动气缸,转化为直线或旋转运动,从而控制夹爪的开合。这类技术因其结构简单、响应快速、成本低廉及维护方便,在自动化产线中具有极高的技术价值,是实现高效、可靠物料搬运的核心单元。其典型应用场景涵盖电子装配、汽车制造、食品包装等行业的上下料、分拣与定位工序。本文以工业自动化中常见的二指平行气动夹爪(常被工程师代号化为“Gripper-A”)为例,深入剖析其从硬件选型、气动系统集成到程序逻辑联锁的完整工程实践。内容聚焦于夹持力计算中惯

weixin_42629671的博客 366

Linux - xarray 工具类

第三层节点直接与绿色的值绑定,若需要像数组一样通过下标访问绿色的值对象那么需要给每一个节点进行编码,这样通过根节点即可访问到具体的对象。对于未使用到的小数组不申请空间,这样只需设计一种方法将这些非连续的小数组在一个数据结构中组织在一起即可,对于这个数组结构需要具有结构紧凑并且能够快速定位到对应的小数组段上,这时候树形结构上场了。一个很大的数组必然可以由一个个小数组拼接而成,若定义一个最小粒度的数组长度,比如长度4,那么从宏观上看一个大数组就由一个个长度为4的小数组排队而成。

ymf604的专栏 1085

AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?

今天主要来围绕CAS技术来说一下,分析并发包的内部结构,看看内部结构、线程池,是基于哪一种原理去实现的。 今天的问题主要是,AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作? 概述 AtomicInteger是对int类型的一个封装,提供原子性的访问和更新操作,原子性操作基于CAS(compare-and-swap)技术 CAS(compare-and-swap)...

0117 350

FTViewSE利用VB脚本制作简易日报表

罗克韦尔SE用VB做的简单的报表

z0800656的博客 3023

高并发编程之AtomicInteger讲解

一、AtomicInteger介绍 ①.支持原子操作的Integer类 ②.主要用于在高并发环境下的高效程序处理。使用非阻塞算法来实现并发控制 二、AtomicInteger的常用的方法 ①.get()方法:获取当前value的值,无锁 package chapter3.atomicinteger; import java.util.concurrent.atomic.AtomicInteger;...

weixin_42146366的博客 1万+

红日-VulnStack靶场-ATT&CK(二):从Weblogic漏洞到域控渗透实战

本文详细解析了红日安全团队VulnStack靶场中从Weblogic漏洞到域控渗透的完整攻击链。通过实战演示Weblogic反序列化漏洞利用、Cobalt Strike持久化控制、域内信息收集及PsExec横向移动等关键技术,复现了企业内网渗透的典型场景,并提供了防御建议。

tgb3456789的博客 935

(2)NPW(监控片)【中】---业务场景精讲

自己在日常工作当中,由于非产线人员出生,对NPW的知识一直一知半解,业务场景认识的不够透彻,做系统的时候很难理解甲方的NPW业务应用,特收集了不少关于NPW的一些业务场景,下面都是一些摘抄,大家关注我标红标粗的部分,

阿拉伯梳子的专栏 1586

java基础总结(五十四)--AtomicInteger使用时注意事项

1来自AtomicInteger类真的是线程安全的嘛? publicfinalintincrementAndGet(){ for(;;){ intcurrent=get();//1 intnext=current+1;//2 if(compareAndSet(current,n...

秋天的猿 4320

Ros入门 (十)----激光雷达避障 简易实现

本篇文章通过订阅/scan话题获取障碍物的距离信息,达到避障目的,提供部分代码,仅供参考。

weixin_51157015的博客 1万+

AtomicInteger 在高并发量应用程序中的使用及volatile说明

当我们在处理简单程序中,可以使用诸如count++这种简单的计数器,但是这种简单的处理在高并发/多线程中的使用却是不安全的,几乎可以百分百的说,得到的数据是未更新的,不是实时数据,然而在JDK1.5之后,却封装了一个类AtomicInteger 可以用来统计这种计数。        该类中有三个变量,其中最重要的是        private volatile int value;  ...

lchina1314的专栏 152

Camera2Demo

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

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

开启多个线程,模拟高并发情况下,使用线程安全的AtomicInteger进行计数

在多线程环境中,"线程安全" 指的是当多个线程同时访问某个公共资源时,能够确保数据的正确性和一致性,避免出现死锁问题。

qq_54655539的博客 705

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【高并发系统设计必修课】:正确使用AtomicInteger lazySet避免数据不可见

掌握高并发场景下AtomicInteger lazySet的可见性问题,有效避免数据更新不可见。适用于状态标志、计数器等无强同步要求场景,通过延迟写保障性能,提升系统吞吐。理解其内存语义差异,合理替换volatile写操作,值得收藏。

BreakNexus的博客 391

WINCC7.3破解文件

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

AtomicInteger在实际项目中的应用

今天写代码,尝试使用了AtomicInteger这个类,感觉使用起来很爽,特别适用于高并发访问,下面贴一个简单的例子: Java代码   CashierContext类部分代码:      private Map counter          = new HashMap();         private void initCounter() {  

zhujiaxing666666的专栏 801

AtomicInteger与Volatile修饰

今天写代码,尝试使用了AtomicInteger这个类,感觉使用起来很爽,特别适用于高并发访问,下面贴一个简单的例子: Java代码   CashierContext类部分代码:      private Map counter          = new HashMap();         private void initCounter() {     

z69183787的专栏 2852

登山 Day6 - AtomicInteger的基本用法

高并发情况下 i++ 和 i-- 线程并不安全

jyfWinds的博客 301

AtomicInteger使用说明

1.概述 java.util.concurrent.atomic.AtomicInteger。 高并发的情况下,i++无法保证原子性,往往会出现问题,所以引入AtomicInteger类。 2.代码实例 2.1不使用AcomicInteger AtomicIntegerDemo 类 import java.util.concurrent.CountDownLatch; import java....

ACGkaka的博客 432

java高并发、多线程(四)--AtomicInteger

java高并发、多线程(四)AtomicInteger AtomicInteger 在上一节中我们举了下面这样一个例子: public class SynchronizedTest { static int count = 0; public synchronized static void add() { for (int i = 0; i < 10000; i++) { count++; } } publi

little_programmer_的博客 606

AtomicInteger 类的理解与使用

AtomicInteger 类的理解与使用 首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下: public class Sample1 { private static Integer count = 0; synchronized public static void increment() { count++;

yushengjun_644的博客 333

AtomicInteger类的理解与使用

对于Java中的运算操作,例如自增或自减,若没有进行额外的同步操作,在多线程环境下就是线程不安全的。num++解析为num=num+1,明显,这个操作不具备原子性,多线程并发共享这个变量时必然会出现问题。 首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下: public class Sample1 { private static Integer ...

丿灬安之若死 324

Java使用AtomicInteger来实现原子性自增

最近工作比较忙,没啥时间写笔记,丢一个老笔记上来吧。 先放出工具类代码: package com.example.demo; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; /** * 使用AtomicI

test253506088的博客 1万+
上一篇: threadLocal简单使用
下一篇: ant的安装、使用,build.xml简单编写
烫手的砖
博客等级 码龄8年 7粉丝 40原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值