JAVA多线程进阶篇 1、JUC原子类之Atomic

MySQL等保三级合规实践:如何安全配置root账户的本地与受信主机登录策略 本文详细介绍了MySQL在等保三级合规框架下如何安全配置root账户的本地与受信主机登录策略。通过分析root账户的特殊保护需求,提供三种安全加固方案,包括限制访问范围、限定登录IP和完全禁止远程登录,并指导创建安全的远程管理账户。文章还涵盖了密码策略强化、日志审计配置和网络层防护等关键合规要求,帮助用户实现MySQL的等保三级全面合规。 阅读详情

JUC 即 java.util.concurrent 包,提供了大量的工具类来简化并发编程。
Atomic类是一种原子类型数据,主要用以解决数值的递增的并发问题。在传统的解决方案中,需要对数值操作代码区进行保护,保护手段一般是加锁。而Atomic类提供了incrementAndGet方法,其内部用了cas操作,直接无锁的操作往上递增,效率大大提升。

1. 原始的synchronized方法

package com.concurrent.juc.ch01;

import java.time.LocalDateTime;

public class ConditionRaceExp {

    private static volatile int cnt = 0;

    public static void main(String[] args) throws InterruptedException {

        Thread[] threads = new Thread[1000];

        for(int i=0;i<threads.length;i++){
            threads[i] = new Thread(()->{
                synchronized(ConditionRaceExp.class) {
                    for (int k = 0; k < 10000; k++) {
                            cnt++;
                    }
                }
            });
        }

        long start = System.currentTimeMillis();
        for(int i=0;i<threads.length;i++){
            threads[i].start();
        }

        for(int i=0;i<threads.length;i++){
            threads[i].join();
        }

        long end = System.currentTimeMillis();

        System.out.println(end-start);
        System.out.println(cnt);
    }
}

2. 使用原子类 AtomicLong

package com.concurrent.juc.ch01;

import java.util.concurrent.atomic.AtomicLong;

public class AtomicTest {
    static AtomicLong cnt = new AtomicLong(0l);

    static void m() {
        for (int i = 0; i < 10000; i++)
            cnt.incrementAndGet();
    }

    public static void main(String[] args) throws InterruptedException {
        Thread[] threads = new Thread[1000];

        for (int i = 0; i < threads.length; i++)
            threads[i] = new Thread(() -> {
                AtomicTest.m();
            });

        long start = System.currentTimeMillis();
        for(int i=0;i<threads.length;i++){
            threads[i].start();
        }

        for(int i=0;i<threads.length;i++){
            threads[i].join();
        }

        long end = System.currentTimeMillis();

        System.out.println(end-start);
        System.out.println(AtomicTest.cnt.get());

    }
}

3. 使用原子类 使用LongAdder

package com.concurrent.juc.ch01;

import java.util.concurrent.atomic.LongAdder;

public class LongAdderTest {
    static LongAdder cnt = new LongAdder();

    static void m() {
        for (int i = 0; i < 10000; i++)
            cnt.increment();
    }

    public static void main(String[] args) throws InterruptedException {
        Thread[] threads = new Thread[1000];

        for (int i = 0; i < threads.length; i++)
            threads[i] = new Thread(() -> {
                AtomicTest.m();
            });

        long start = System.currentTimeMillis();
        for(int i=0;i<threads.length;i++){
            threads[i].start();
        }

        for(int i=0;i<threads.length;i++){
            threads[i].join();
        }

        long end = System.currentTimeMillis();

        System.out.println(end-start);
        System.out.println(AtomicTest.cnt.get());

    }
}

总结

atomic类的原理是CAS,因此不会消耗操作系统锁资源。

LongAdder的内部做了一个分段锁,线程会分配到不同的段内,在计算值时再进行累积。

因此这两个方法比较适合此类场景。当然使用synchronized方法也是可以的。在粗化锁的适合,速度甚至快于前两种方法,但是在细化锁的时候效率就显得低下了。

多线程系列在github上有一个开源项目,主要是本系列博客的实验代码。

https://github.com/forestnlp/concurrentlab

如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。

PADS VX2.7学习记录05-PADS Layout设计文件Gerber等输出整理 在“PDF Document”栏中,依次选中除REF-TOP和REF-BOT之外的文件,单击图标,将其余PDF Document文件进行删除,如图所示。然后单击【生成PDF】按钮,即可创建一份PDF格式的位号图。 阅读详情

相关推荐

GBase8a-GDCA认证考试-复习参考题

为提升产品服务水平定期举办GBase产品认证培训,培训更多GBase数据库专业人员,满足用户快速成长的业务需求,建设GBase产品生态。请注意甄别,根据所学知识综合判断,正确率97%(97分)。

weixin_41826637的博客 2374

Java JUC之Atomic系列12大类实例讲解和原理分解

在java6以后我们不但接触到了Lock相关的锁,也接触到了很多更加乐观的原子修改操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,以及并发中的ABA问题,本文讲述Atomic系列的类的实现以及使用方法,其中包含: 基本类:AtomicInteger、AtomicLong、AtomicBoolean; 引用类型:AtomicReference...

iteye_14356的博客 352

振动分析中相位的确定

更是定位不平衡量角度的关键。是确定振动信号与转子旋转位置之间时间关系的核心步骤,而。以内,以确保校正配重安装角度的有效性。在实际动平衡中,相位角的误差需控制在。在振动分析和动平衡中,

轩辕霸天L 2735

深入了解 Java JUC(一)之 atomic(原子数据类的包)

目录 1. JUC简介: 2. atomic(原子数据类的包)内部实现原理 3. 以 AtomicInteger 为例,内部的CAS实现 1. JUC简介: JUC 是 java.util.concurrent 的简称,在 Java 5.0 提供了java.util.concurrent(简称JUC)包,这个包包含了一系列能够让 Java 的并发编程变得更加简单轻松的工...

古小龙 593

深度学习中的编码器-解码器架构

解码的作用:转换为人类可理解的形式,解码器的任务是将编码器生成的中间表示(上下文向量)转换回人类可理解的输出形式(如翻译后的文本、生成的图像描述等)。解码器通过逐步生成输出序列,使得最终的输出符合人类的理解和需求。编码的作用:转换为机器可理解的形式,编码器将输入数据(如文本、图像等)转换为一种机器更容易处理和理解的形式,即上下文向量或编码。在深度学习中,编码器(Encoder)解码器(Decoder)是常见的神经网络架构,通常用于处理序列到序列(seq2seq)任务,如机器翻译、文本摘要和图像描述等。

xxk1323的博客 1093

Icarus Verilog和GTKwave使用简析

本简要介绍Icarus Verilog和GTKwave的使用,使用iverilog(Icarus Verilog)编译仿真verilog而使用GTKWave查看仿真数据波形下载安装 基本使用 iverilog使用 GTKWave使用 iverilog常用选项 使用库 注意

husipeng86的专栏 1万+

JUC Atomic:原子类解析

文章目录一、JUC 包中的原子类是哪 4 类?二、CAS详解1、CAS的概念2、CAS的好处3、CAS的问题3.1 ABA问题3.2 循环时间长开销大3.3 只能保证一个共享变量的原子操作 一、JUC 包中的原子类是哪 4 类? 基本类型 使用原子的方式更新基本类型 AtomicInteger:整形原子类 AtomicLong:长整型原子类 AtomicBoolean:布尔型原子类 数组类型 使用原子的方式更新数组里的某个元素 AtomicIntegerArray:整形数组原子类 Atomic

qq_38327769的博客 950

稀疏阵列选型指南:互质阵、嵌套阵、MRA,谁才是你项目里的‘性价比之王’?

本文深入探讨了稀疏阵列技术中的互质阵、嵌套阵和MRA三大架构的工程化选型策略,重点分析了它们在DOA估计、自由度、旁瓣抑制和计算复杂度等核心指标上的表现。通过实际案例和配置示例,为智能天线、声学定位和毫米波雷达等应用场景提供技术选型指南,帮助研发团队在硬件成本与性能之间找到最佳平衡点。

weixin_42525005的博客 488

JUC 包中的 Atomic 原子类总结

Atomic翻译成中文是“原子”的意思。在化学上,原子是构成物质的最小单位,在化学反应中不可分割。在编程中,Atomic指的是一个操作具有原子性,即该操作不可分割、不可中断。即使在多个线程同时执行时,该操作要么全部执行完成,要么不执行,不会被其他线程看到部分完成的状态。原子类简单来说就是具有原子性操作特征的类。包中的Atomic原子类提供了一种线程安全的方式来操作单个变量。Atomic类依赖于 CAS(Compare-And-Swap,比较并交换)乐观锁来保证其方法的原子性,而不需要使用传统的锁机制(如。

double222222的博客 2496

第五章 PCIe介绍 5.1-5.7

为什么SSD要用PCIe接口?因为它快,比SATA快。通道,PCIe最多可以有32个通道。两个设备之间的PCIe连接,叫做一个Link。如下图,设备A和设备B是个双向连接,两个PCIe设备之间,有专门的发送和接收通道,数据可以同时往两个方向传输,PCIe Spec称这种工作模式为,可以理解为。和PCIe一样,SATA有独立的发送和接收通道。但与PCIe工作模式不一样,同一时间,SATA只有一条通道可以进行数据传输。这种工作模式称为。与SATA单通道不同,PCIe连接可以通过增加通道数扩展带宽。

fengbaobaola的博客 2969

【Claude Code】Unable to connect to API 报错原因与排查解决全流程

深入分析 Claude Code 中 Unable to connect to API 系列报错的根因,涵盖 ECONNREFUSED、ECONNRESET、ETIMEDOUT 等 6 种变体,提供从网络连通性检测、代理配置到 LLM 网关路由的完整排查路径,帮助开发者快速恢复 Claude Code 的正常使用。

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 2850

并发-JUC之ATOMIC包分析

该类提供了一系列方法来更新和获取对象的引用,例如 get 方法用于获取当前对象的引用,set 方法用于设置对象的引用,compareAndSet 方法用于比较当前对象的引用并在匹配时更新为新的引用 与AtomicInteger方法基本相同,不同的是成员变量value改为泛型V。需要注意的是,LongAccumulator 类的构造函数需要传入两个参数,第一个参数是一个函数对象,用于指定对两个 long 类型的值进行计算的方式,例如 Long::max 表示计算两个值的最大值。第二个参数是累加器的初始值。

他很懒,但也在努力的生活着 195

2025年7月12日全国青少年信息素养大赛图形化(Scratch)编程小学低年级组复赛真题+答案解析

2025年7月12日全国青少年信息素养大赛图形化(Scratch)编程小学低年级组复赛真题+答案解析

伶俐角少儿编程 711

【JUC基础】10. Atomic原子类

Atomic英译为原子的。原子结构通常称为不可分割的最小单位。而在JUC中,java.util.concurrent.atomic 包是 Java 并发库中的一个包,提供了原子操作的支持。它包含了一些原子类,用于在多线程环境下进行线程安全的原子操作。使用原子类可以避免使用锁和同步机制,从而减少了线程竞争和死锁的风险,并提高了多线程程序的性能和可伸缩性。

有一只柴犬的专栏 2086

数学建模模型总结

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

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

JUC多线程:Atomic原子类与CAS原理

tomic 原子操作类是基于无锁 CAS + volatile 实现的,并且类中的所有方法都使用 final 修饰,进一步保证线程安全。而 CAS 算法的具体实现方式在于 Unsafe 类中,Unsafe 类的所有方法都是 native 修饰的,也就是说所有方法都是直接调用操作系统底层资源进行执行相应任务。Atomic 使用乐观策略,每次操作时都假设没有冲突发生,并采用 volatile 配合 CAS 去修改内存中的变量,如果失败则重试,直到成功为止。

张维鹏的博客 9966

Camera2Demo

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

【JUC系列-03】熟练掌握Atomic原子系列基本使用

熟练掌握Atomic原子类的基本使用

zhenghuishengq的博客 7947

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

15.JUC原子类

基础原子类(以AtomicInteger为例),主要是通过CAS自旋 + volatile相结合的方案实现,既保证了变量操作线程的原子性,有避免了synchronized重量级锁的开销,使得Java程序的效率得到大幅度提升。基础原子类型 只能保证一个变量的原子操作,但是当需要对多个变量操作时,CAS无法保证原子性操作,这个时候可以使用AtomicReference(原子引用类型),保证对象引用的原子性。属性更新原子类是Java并发包提供的一组类,用于原子性地更新对象中的属性值。

q1372302825的博客 1217

【多线程与高并发 四】CAS、Unsafe 及 JUC 原子类详解

这系列文章讲述多线程及高并发详解,此文主要讲述CAS、Unsafe 及 JUC 原子类详解,包括CAS的操作过程及存在的问题、Unsafe类的介绍及典型应用,Atomic原子类

若明天不见 1907

JAVA多线程之——并发包JUC——Atomic

前面学习了基础的多线程知识。今天开始学习JAVA的并发包java.util.concurrent。java并发包包括 java.util.concurrent、java.util.concurrent.atomic、java.util.concurrent.locks包。今天开始学习atomic包下的内容’ 概念 java从jdk1.5开始引入了并发包。其中java.util.concurren

永不止步 3913

Java多线程--原子类(atomic)的用法(有实例)

本文用示例介绍Java的原子类的用法。 原子类属于JUC。 原子类由CAS操作保证原子性,由volatile关键字保证可见性。 原子类自jdk 1.5开始出现,位于java.util.concurrent.atomic包下面。jdk 1.8又新增了4个性能更好的原子类。

IT利刃出鞘的博客 4663

Java-Atomic-原子类-总结

Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。所以,所谓原子类说简单点就是具有原子/原子操作特征的类。并发包的原子类都存放在下,如下图所示。根据操作的数据类型,可以将 JUC 包中的原子类分为 4 类基本类型使用原子的方式更新基本类型:整型原子类AtomicLong:长整型原子类:布尔型原子类数组类型。

Java程序员的知识博客 2164

Java atomic原子操作类的介绍

基于JDK1.8详细介绍了JUC下面的atomic子包中的大部分原子类的原理和使用!

终生学习践行者 4946

深入解析 JUC 包中的 Atomic 原子类:高并发编程的利器

JUC 包中的 Atomic 原子类提供了一种高效的无锁线程安全操作方式,适用于高并发场景。通过使用 CAS 操作,这些类能够在多线程环境下保证操作的原子性,避免了使用锁带来的性能开销。在实际开发中,根据具体需求选择合适的原子类,可以显著提升并发程序的性能和可靠性。关注我【36度代码人生】,回复“并发编程”获取更多并发编程精品资料。

程序员笔记 858

JUC之Atomic原子类

java.util.concurrent.atomic 包提供了一些基于CAS(Compare-and-Swap)算法的原子操作类,用于在多线程环境下进行原子操作,避免了使用 synchronized 等锁机制的开销和复杂性。以下是该包中一些常用的类及其实现原理。

流华追梦的专栏 513

Java并发-JUC原子类详解

CAS的全称为Compare-And-Swap,直译就是对比交换。是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值,经过调查发现,其实现方式是基于硬件平台的汇编指令,就是说CAS是靠硬件实现的,JVM只是封装了汇编调用,那些AtomicInteger类便是使用了这些封装后的接口。简单解释:CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下在旧值有没有发生变化,如果没有发生变化,才交换成新值,发生了变化则不交换。

HCDuo6956的博客 843

JUC-15. 原子类(Atomic)

Atomic翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。所以,所谓原子类说简单点就是具有原子/原子操作特征的类。本章通过AtomicInteger、AtomicIntegerArray、AtomicReference等案例讲解原子类的使用方式.........

苏渠的博客 940
上一篇: JAVA多线程基础篇 6、详解synchronized
下一篇: JAVA多线程进阶篇 2、JUC重入锁之ReentrantLock
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值