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

AtomicInteger——Java中的多线程共享原子计数器 先获取当前值,再加1。相当于。 阅读详情

java高并发、多线程(四)

AtomicInteger

在上一节中我们举了下面这样一个例子:

public class SynchronizedTest {

    static int count = 0;
    public synchronized static void add() {
        for (int i = 0; i < 10000; i++) {
            count++;
        }
    }

    public static void main(String[] args) {
        List<Thread> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            list.add(new Thread(SynchronizedTest::add,"Thread-"+i));
        }
        list.forEach(t->t.start());
        list.forEach(t-> {
            try {
                t.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        System.out.println(count);
    }
}

如果我们不使用synchronized可以达到相同目的吗?

答案是肯定的,可以使用AtomicInteger类来完成相应功能。
将上述代码修改为:

	static AtomicInteger count = new AtomicInteger(0);
    public  static void add() {
        for (int i = 0; i < 10000; i++) {
            //等同于count++
            count.incrementAndGet();
        }
    }

运行结果:
在这里插入图片描述
为什么不使用synchronized,上述程序仍然能达到线程安全呢?
答案很明显在AtomicInteger类上,因为它是线程安全的,它能保证它的操作是原子性的。那它是如何保证的呢?我们来查看它的源码:
在这里插入图片描述
在这里插入图片描述
从上面可以看到,该类使用了unsafe类及其中的compareAndSwapInt方法。

  • unsafe类
    从名字上可以看出这个类是不安全的,因为它给了java像C/C++一样操作内存空间的能力。例如:
public class UnsafeTest {
    public static void main(String[] args) {
//        通过getUnsafe()方法获取unsafe对象将抛出SecurityException异常
//        但是我们发现unsafe类源码中有private static final Unsafe theUnsafe属性;因此在这里我们可以通过反射获取unsafe对象
        Field theUnsafe = null;
        Unsafe unsafe = null;
        try {
            theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
            theUnsafe.setAccessible(true);
            unsafe = (Unsafe)theUnsafe.get(null);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
//      创建num一个实例对象
        NUM num = new NUM();
//      通过反射获取num对象的a属性
        Field a = null;
        try {
            a = num.getClass().getDeclaredField("a");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
//      通过unsafe获取a的值
        int anInt = unsafe.getInt(num, unsafe.objectFieldOffset(a));
        System.out.println(anInt);
//      通过unsafe修改a的值
        unsafe.putInt(num,unsafe.objectFieldOffset(a),10);
        System.out.println(num.getA());
    }
}

/**
 * 创建一个类,具有私有属性a
 */
class NUM{
    private int a;

    public NUM() {
        this.a = 1;
    }

    public int getA() {
        return a;
    }
}

运行结果:
在这里插入图片描述

  • compareAndSwapXXX()方法

CAS(Compare And Swap)是一种无锁的比较交换策略,我们通常使用的synchronized 是一种悲观锁,它所假定的是线程在运行中总会遇上冲突,因此首先就给同步代码块上锁,致使性能降低。但是CAS不用去加锁,它所使用的方式是通过比较属性值与期望值相同,那么就直接修改,不同则循环重试。在性能上要优于synchronized。在java的并发包中大多数类都使用的是该策略。

DigitalOcean多节点LLM训练实战:A10 GPU集群微调13B模型 大语言模型(LLM)微调正从科研走向工程落地,中等规模模型(如13B级)的全参数或QLoRA微调已成为SaaS、教育科技与个人研究的刚需。其核心挑战在于平衡显存约束、分布式通信效率与基础设施运维成本。基于NVIDIA A10 GPU的云实例,配合DeepSpeed ZeRO-3、CPU Offload与TCP网络软优化,可在无RDMA环境下实现稳定多节点训练;结合Streaming数据加载与对象存储解耦,显著降低IO瓶颈与状态依赖。本文聚焦DigitalOcean平台,详解如何在4–8节点、16卡以内规模下 阅读详情

相关推荐

AtomicInteger详解

AtomicInteger类是系统底层保护的int类型,通过对int类型的数据进行封装,提供执行方法的控制进行值的原子操作。AtomicInteger它不能当作Integer来使用从JAVA1.5开始,AtomicInteger属于java.util.concurrent.atomic包下的一个类。...

优秀的程序员不应该是CRUD 1万+

高效并发

高效并发1. 概述1.1. 引入缓存由于内存和处理之间的速度差异,所以说在内存和处理之间加入一层高速缓存。将需要运算的数据复制到缓存中,使运算快速执行,处理器执行后,再将缓存中的结果同步到内存。1.2. 数据不一致性引入缓存解决了内存和处理器速度不匹配问题,但是引入了缓存不一致性问题。在多处理器系统中,每一个处理器都有自己的缓存,而它们共享主内存。当多个处理器处理主内存中同一块区域的数据时,将可能...

KCHEN 285

GlobalPlatform Technology Secure Channel Protocol ‘03‘ 标准 - 安全通道协议简介

按照GlobalPlatform Technology Secure Channel Protocol '03' (SCP03)标准,描述了如何利用S-MAC,S-RMAC,S-ENC进行安全通信的过程。

mmmx777的专栏 6091

Java多线程 - AtomicInteger线程安全原理

文章目录问题1:AtomicInteger线程安全原理问题2:AtomicIntegerArray中的数组为什么没有使用volatile修饰?问题3:说一下Atomic的原理? 问题1:AtomicInteger线程安全原理 基础原子类(以AtomicInteger为例)主要通过CAS自旋+volatile的方案实现,既保障了变量操作的线程安全性,又避免了synchronized重量级锁的高开销,使得Java程序的执行效率大为提升。CAS用于保障变量操作的原子性,volatile关键字用于保障变量的可见性,

你今天真好看呀 2067

MIA文献阅读 —— 深度学习在医学图像分析中的最新进展及临床应用【2024】_再现性;深度学习

coderVAEVAEVAE) (Kingma威林,2014)在概率性的工作方式学习观测数据之间的映射空间x∈Rmx∈R^mx∈Rm 和潜在的空间z∈Rnmnz∈Rn(m>>n)。作为一个潜变量模型,VAEVAEVAE制定这个问题作为观察样品的最大化对数似logpxlog∫px∣zpzdzpx∣zp (x | z)p(x∣z)可以很容易地使用神经网络建模,和pzp (z)

2401_84181704的博客 1242

Index-TTS-1.5:多模态语音合成的技术演进与商业落地实践

本文深入探讨了Index-TTS-1.5在多模态语音合成领域的技术演进与商业落地。该模型基于GPT风格的自回归Transformer架构,通过优化条件编码器和引入字符-拼音混合建模,显著提升了语音生成的稳定性、精准度和真实感,实现了高质量的零样本语音克隆。文章还详细介绍了其云端体验、本地WebUI部署及ComfyUI集成等实战路径,并分析了其在虚拟数字人、个性化内容创作等商业场景中的应用潜力与挑战。

weixin_29098367的博客 400

并发编程学习笔记 之 原子操作类AtomicInteger详解

  原子类型就是一种无锁的、线程安全的类型,解决了在多线程场景下使用基本数据类型和引用类型的线程不安全的问题。具体示例如下:   在上述代码中,运行了10个线程,每个线程均对count变量进行了1000的计数器自增操作,理想情况下,运行结束后,这个时候count的值应该是10000,但是实际情况,每次结果都可能不相同,有可能是10000,也有可能是小于10000的其他值。为什么出现这种情况呢?其实就是多个线程对count共享变量进行并行操作,导致部分线程的计算结果对其他线程不可见,造成了数据丢失。那么在共享

向心行者 2392

silvaco——GaN HEMT探索

上图为输出特性曲线 ,分别是在栅压为1v、3v、5v的情况下,可以看出在1v时器件处于截止状态,只有非常小近似于0的电流通过,随着栅压逐渐增大,沟道开启,产生漏极电流。上图为栅极漏电流曲线和转移特性曲线以及其提取的参数,可以看到阈值电压为=1.30249V,当栅压为0v时,Id=8.01032e-006,当栅压为5V时,Ig=3.11627e-006。albrct.n,低场迁移率模型,bn.albrct,an.albrct是albrct模型中的参数,可以由用户自己设定。lat.temp,晶格自热模型;

weixin_61913839的博客 7616

高并发编程之AtomicInteger讲解

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

weixin_42146366的博客 1万+

高通平台 Android T 蓝牙技术全解析:架构、代码与实现原理

协议栈、配置文件和服务都运行在一个独立的用户空间进程。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 99

用 SAP S/4HANA Configure Predefined Custom Fields 玩转预定义自定义字段:从概念到实战

SAP预定义自定义字段配置指南:安全扩展业务模型的云原生方案 摘要: 本文系统介绍SAP S/4HANA Cloud中预定义自定义字段的配置方法,对比普通自定义字段与预定义字段的区别,阐述其技术特点与业务价值。重点解析"Configure Predefined Custom Fields"应用的核心功能,包括字段元数据配置、多语言支持、UI集成等能力,并通过业务伙伴扩展案例演示完整实施流程。文章指出预定义字段方案在云环境下的独特优势:既满足业务扩展需求,又能保证系统可升级性,是SaaS环

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 79

AtomicInteger是什么?int类型和AtomicInteger类型在多线程场景下的性能表现

AtomicInteger是什么?int类型和AtomicInteger类型在多线程场景下的性能表现

weixin_45428910的博客 1217

Unity 佳能SDK 及数据获取

3. 把CameraControl 下面只要是绿色的 .cs 文件都复制到Unity 中。1. 填写信息跟官方申请SDK,大概1-2个工作日会邮件回复你。2. 将SDK这两个文件放到 Unity Plugins文件夹。

我知道你很急,但是路要一步步走 1475

Java AtomicInteger:线程安全与高并发解析

在当今的互联网时代,高并发已经成为许多应用场景的常态。特别是在服务器端编程中,如何确保数据的一致性和线程安全是至关重要的。以一个在线购物平台为例,当用户进行购物操作时,系统需要处理大量的并发请求,确保每个用户的购物车数据能够准确无误地更新。在这个过程中,AtomicInteger 类作为一种原子操作类,在保证线程安全方面发挥着至关重要的作用。AtomicInteger 是 Java 并发编程中常用的一种原子操作类,它提供了原子性的整数值增加和减少操作。

JavaCodePro的博客 820

部署OpenClaw(ClawdBot、MoltBot)后访问localhost:18789报1008错误怎么办?

部署openclaw(曾用名ClawdBot、MoltBot)后访问localhost:18789出现1008授权错误❌?本文分享如何快速解决这个问题✅

XiaoqiangClub的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

原子操作类AtomicInteger详解

为什么需要AtomicInteger原子操作类? 对于Java中的运算操作,例如自增或自减,若没有进行额外的同步操作,在多线程环境下就是线程不安全的。num++解析为num=num+1,明显,这个操作不具备原子性,多线程并发共享这个变量时必然会出现问题。测试代码如下: public class AtomicIntegerTest { private static final int...

分享传递价值 22万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

了解 Java 中的 AtomicInteger 类

在多线程编程中,保证数据的原子性操作是至关重要的。而 Java 提供了一系列的原子类来支持这一需求,其中之一就是。

double222222的博客 2170

高并发编程之原子操作类AtomicInteger讲解

一:为什么需要AtomicInteger原子操作类? 在Java中的运算操作中,我们经常会遇到自增或自减的运算操作,在单线程的场景下,num++解析为num=num+1这样是不会出现问题的,但很多的业务场景是需要在多线程或者并发的场景下进行操作的,若没有进行额外的同步操作,在多线程环境下就是线程不安全的。num++解析为num=num+1,明显,这个操作不具备原子性,多线程并发共享这个变量时必然会出现问题。 下面来个测试代码看看: ...

初夏0811的博客 2万+

【Java多线程】AtomicInteger使用

AtomicInteger 提供了线程安全的方法,一般用于多线程并发计数。 在今天遇到使用AtomicInteger的源码,发现它的逻辑有点漏洞,故写了以下代码抽象出大概逻辑,来验证自己的想法。 废话少说先上代码,UILCacheSizeTest该类提供指定大小上限sizeLimit,而以下代码时上限失效了。 存在该问题的原因是AtomicInteger 的方法是线程

Zenip的专栏 1661

【详解】Java高并发原子类型之AtomicInteger

【详解】Java高并发原子类型之AtomicInteget

xzzz2020的博客 525

Java多线程与高并发专题——AtomicInteger 在高并发下性能不好,为什么?如何解决?

Java多线程与高并发专题——AtomicInteger 在高并发下性能不好,为什么?如何解决?

从知识输入到知识输出 1267

聊聊多线程(四)线程安全之AtomicInteger类

AtomicInteger能够实现整型数据的原子操作,在多线程并发的环境下能保证数据安全,而且内部使用乐观锁实现,比使用锁机制的并发性能高volatile保证了一个线程修改数据时,其它线程也能看到数据的修改CAS操作保证了数据修改的安全性大家如果需要学习其他Java知识点,戳这里超详细的Java知识点汇总网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化资料的朋友,可以点击这里获取一个人可以走的很快,但一群人才能走的更远!

2401_84281594的博客 869

Java并发基础:原子类之AtomicInteger全面解析

AtomicInteger类提供了线程安全的整数操作,它通过利用底层硬件的原子性指令,能够在多线程环境中高效地实现整数的无锁更新,避免了传统同步机制带来的性能开销,在高并发场景下成为计数器可大幅提高程序的执行效率,同时又保证了数据一致性。

科技互联网领域深度探索者,乐于分享与写作。 3952
上一篇: java高并发、多线程(三)--synchronized
下一篇: 算法与数据结构(一)--排序算法(一)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值