Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >并发编程中的原子类

并发编程中的原子类

作者头像
Dream城堡
发布于 2019-05-20 02:30:26
发布于 2019-05-20 02:30:26
46200
代码可运行
举报
文章被收录于专栏:Spring相关Spring相关
运行总次数:0
代码可运行
1.什么是原子类

一度认为原子是不可分割的最小单位,故原子类可以认为其操作都是不可分割

1.1 为什么要有原子类?

对多线程访问同一个变量,我们需要加锁,而锁是比较消耗性能的,JDk1.5之后, 新增的原子操作类提供了 一种用法简单、性能高效、线程安全地更新一个变量的方式, 这些类同样位于JUC包下的atomic包下,发展 到JDk1.8,该包下共有17个类, 囊括了原子更新基本类型、原子更新数组、原子更新属性、原子更新引用

1.2 1.8新增的原子类

DoubleAccumulator、DoubleAdder、LongAccumulator、LongAdder、Striped64

2.原子更新基本类型

发展至JDk1.8,基本类型原子类有以下几个: AtomicBoolean、AtomicInteger、AtomicLong、DoubleAccumulator、DoubleAdder、LongAccumulator、 LongAdder 大致可以归为3类 AtomicBoolean、AtomicInteger、AtomicLong 元老级的原子更新,方法几乎一模一样 DoubleAdder、 LongAdder 对Double、Long的原子更新性能进行优化提升 DoubleAccumulator、LongAccumulator 支持自定 义运算

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * atomicInteger Demo
 */
public class Demo1 {

    private static AtomicInteger sum = new AtomicInteger(0);

    public static void inCreate() {

        sum.incrementAndGet();


    }


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


        for (int i = 0; i < 10; i++) {
            new Thread(()->{

                for (int j = 0; j < 100; j++) {
                    inCreate();
                    System.out.println(sum);
                }
            }).start();

        }

    }
}
LongAccumulator Demo自定义运算
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * LongAccumulator Demo
 * 自定义运算
 */
public class Demo2 {


    public static void main(String[] args) {

        //输入一个数字,如果比上一个输入的大,则直接返回
        //如果小则返回上一个
        LongAccumulator longAccumulator =
                new LongAccumulator((left, right) ->

//                    left > right ? left : right,
                    left+right ,
                        0L
                );
        longAccumulator.accumulate(3L);
        System.out.println(longAccumulator.get());
        longAccumulator.accumulate(5L);
        System.out.println(longAccumulator.get());
    }
}
3.原子更新数组类型

AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * AtomicIntegerArry  Demo
 */
public class AtomicIntegerArryDemo {

    public static void main(String[] args) {

        int[] arr = new int[]{3, 2};

        AtomicIntegerArray atomicIntegerArray = new AtomicIntegerArray(arr);

        //下标和步长
        int i = atomicIntegerArray.addAndGet(1, 8);
        int j = atomicIntegerArray.addAndGet(0, 8);

        System.out.println("i:" + i + "--j:" + j);

        System.out.println(  atomicIntegerArray.toString());

        //自定义运算
        /**
         *下标
         * 把下标的值更新为20
         * 相关的运算
         */
        int k = atomicIntegerArray.accumulateAndGet(
                0, 20, (left, right) ->
                        left >right?left:right
        );
        System.out.println(  atomicIntegerArray.toString());
        System.out.println("k->"+k);

    }
}
4.原子地更新属性

原子地更新某个类里的某个字段时,就需要使用原子更新字段类,Atomic包提供了以下4个类进行原子字段更新 AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicStampedReference、AtomicReferenceFieldUpdater

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * AtomicLongFieldUpdateDemo
 */
public class AtomicLongFieldUpdaterDemo {

    static class Student {

        volatile long id;
        volatile String name;

        public Student(long id, String name) {
            this.id = id;
            this.name = name;
        }

        public long getId() {
            return id;
        }

        public void setId(long id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }


    public static void main(String[] args) {
        AtomicLongFieldUpdater<Student> longFieldUpdater = AtomicLongFieldUpdater.newUpdater(Student.class, "id");

        Student testStu = new Student(1L, "test");
        longFieldUpdater.compareAndSet(testStu, 1L, 100L);

        System.out.println("id=" + testStu.getId());

        AtomicReferenceFieldUpdater<Student, String> referenceFieldUpdater = AtomicReferenceFieldUpdater.newUpdater(Student.class, String.class, "name");

        referenceFieldUpdater.compareAndSet(testStu, "test", "update");
        System.out.println("name=" + testStu.getName());

    }

}
5.原子更新引用

AtomicReference:用于对引用的原子更新 AtomicMarkableReference:带版本戳的原子引用类型,版本戳为boolean类型。 AtomicStampedReference:带版本戳的原子引用类型,版本戳为int类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class AtomicReferenceDemo {

    public static void main(String[] args) {
        AtomicReference<Student> studentAtomicReference = new AtomicReference<>();

        Student stuTest01 = new Student(1L, "test01");
        Student stuTest02 = new Student(2L, "test02");
        //先设置值
        studentAtomicReference.set(stuTest01);
        studentAtomicReference.compareAndSet(stuTest01,stuTest02);
        //再得到更新值
        Student studentUpd = studentAtomicReference.get();
        System.out.println(studentUpd.getName());


    }


}

class Student{

    private long id;
    private String name;

    public Student(long id, String name) {
        this.id = id;
        this.name = name;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.05.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
死磕 java原子类之终结篇
原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换。
彤哥
2019/07/08
4690
死磕 java原子类之终结篇
Java中的原子类
在前面的内容中,我们已经学习了CAS的原理,所以对于学习本节来说会非常容易。本节介绍Java中的原子类是java.util.concurrent.atomic包下的对象,他们之所以有原子性的共性,都来源于CAS,可见CAS的重要性。对于原子类变量的操作是不会存在并发性问题的,不需要使用同步手段进行并发控制。它底层自身的实现即可保证变量的可见性以及操作的原子性,一般我们可以使用AtomicInteger,AtomicLong等实现计数器等功能,利用AtomicBoolean实现标志位等功能。
胖虎
2020/12/22
7430
Java中的原子类
彻底理解Java并发:Java并发原子类
在 Jdk1.5 开始 Java 开始引进提供了 java.util.concurrent.atomic 包,到 Jdk8 时,atomic 包共提供了 16 个原子类,分为 6 种类型,分别是:①、基本类型原子类;②、数组类型原子类;③、引用类型原子类;④、原子更新属性;⑤、Adder 加法器;⑥、积累器。
栗筝i
2022/12/01
6080
原子操作类Atomic
因为对象的属性修改类型原子类都是抽象类,所以每次使用都必须使用静态方法newUpdater()创建一个更新器,并且需要设置想要更新的类和属性。
鱼找水需要时间
2023/02/16
2.4K0
原子操作类Atomic
Java16个原子类介绍-基于JDK8
emmmm,在写文章前我也翻阅了好多资料和书籍,其实大家在对原子类方法的使用介绍基本都没问题,但是对于java中原子类的个数是五花八门,下面我就把自己都认知和书籍资料结合起来给大家简单都介绍下java中原子类的应用。
胖虎
2019/06/26
8340
Java16个原子类介绍-基于JDK8
AtomicInteger原子类原理解析
原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换。
黑洞代码
2021/01/14
3390
AtomicInteger原子类原理解析
Java的Atomic原子类
Java SDK 并发包里提供了丰富的原子类,我们可以将其分为五个类别,这五个类别提供的方法基本上是相似的,并且每个类别都有若干原子类。
真正的飞鱼
2023/05/26
3190
Java的Atomic原子类
【死磕Java并发】常用并发原子类详解
在 Java 的java.util.concurrent包中,除了提供底层锁、并发同步等工具类以外,还提供了一组原子操作类,大多以Atomic开头,他们位于java.util.concurrent.atomic包下。
Java极客技术
2023/12/14
2920
【死磕Java并发】常用并发原子类详解
并发编程系列之掌握原子类使用
如果不加锁,仅仅使用volatile关键字?运行几次,发现统计的数值是有偏差的,所以volatile是不一定能保证线程安全的
SmileNicky
2021/12/06
2100
并发编程系列之掌握原子类使用
一文扫尽Java中的并发原子类,yyds!!
中秋假期已经过去了,小伙伴们玩得开不开心呀?看票圈很多小伙伴都在景区打卡了,这个假期我是没咋出去玩,放假的前两天宅在家里看完了《分布式系统与一致性》这本书,挺不错的,后面给大家写几篇总结。
冰河
2022/06/15
2920
一文扫尽Java中的并发原子类,yyds!!
吃透并发编程之—-Atomic原子类学习思考
发生冲突的情况会大大增加 (也就是存在大量更新时去比较预期的值发生了变化,导致此次更新失效的情况),因此效率会大大降低
Joseph_青椒
2023/09/07
2650
吃透并发编程之—-Atomic原子类学习思考
Juc并发编程10——原子类与ABA问题解决方案
除了加锁以外,还可以使用原子类实现操作原子性。它底层采用CAS算法,使用简单、性能高效、线程安全。
半旧518
2022/10/26
3250
Juc并发编程10——原子类与ABA问题解决方案
原子操作类解读
Java中提供了一些原子操作类,用于实现多线程环境下的数据同步问题。其中最常见的有以下几种:
一个风轻云淡
2023/10/15
2570
原子操作类解读
【Java】原子类
保证线程安全是 Java 并发编程必须要解决的重要问题。Java 从原子性、可见性、有序性这三大特性入手,确保多线程的数据一致性。
后端码匠
2023/02/27
1.2K0
【Java】原子类
Java并发编程之cas理论(无锁并发)
前面看到的AtomicInteger的解决方法,内部并没有用锁来保护共享变量的线程安全。那么它是如何实现的呢?
冬天vs不冷
2025/01/21
790
Java并发编程之cas理论(无锁并发)
Android并发编程 原子类与并发容器
在Android开发的漫漫长途上的一点感想和记录,如果能给各位看官带来一丝启发或者帮助,那真是极好的。
LoveWFan
2019/01/03
7000
基础篇:JAVA原子组件和同步组件
在使用多线程并发编程的时,经常会遇到对共享变量修改操作。此时我们可以选择ConcurrentHashMap,ConcurrentLinkedQueue来进行安全地存储数据。但如果单单是涉及状态的修改,线程执行顺序问题,使用Atomic开头的原子组件或者ReentrantLock、CyclicBarrier之类的同步组件,会是更好的选择,下面将一一介绍它们的原理和用法
潜行前行
2021/01/21
6250
JUC 中的 Atomic 原子类
Java1.5的Atomic包名为java.util.concurrent.atomic。
Vincent-yuan
2021/07/20
4900
JUC 中的 Atomic 原子类
【小家java】原子操作你还在用Synchronized?Atomic、LongAdder你真有必要了解一下了
写这篇博文的原因,是因为我今天在看阿里的规范手册的时候(记录在了这里:【小家java】《阿里巴巴 Java开发手册》读后感—拥抱规范,远离伤害),发现了有一句规范是这么写的:
YourBatman
2019/09/03
9320
【小家java】原子操作你还在用Synchronized?Atomic、LongAdder你真有必要了解一下了
Java原子操作Atomic类详解
      1.CAS(Compare And Swap,比较并交换),通常指的是这样一种原子操作:
忧愁的chafry
2022/10/30
7350
Java原子操作Atomic类详解
相关推荐
死磕 java原子类之终结篇
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验