• java中的原子操作类


    前言

    即使一个简单的i++,在多线的环境下也是不安全的,但是加锁之后,效率又显得过于笨重。因此java提供了Atomic包,这个包中的原子类操作提供了一种用法简单,性能高效,线程安全的更新一个变量的方式

    原子类型基本更新类

    AtomicBoolean:原子更新布尔类型
    AtomicInteger:原子更新整型
    AtomicLong:原子更新长整型
    以上三种就是原子类型基本更新类,至于三个类提供的方法,我就不介绍了,有兴趣可以去看java的api文档。
    java中有八种基本数据类型,我们这里只有三个原子类型操作类,那么剩下的几种怎么更新呢。

    public final native boolean compareAndSwapLong(Object o, long offset, long expected, long x);
    public final native boolean compareAndSwapLong(Object o, long offset, long expected, int x);
    public final native boolean compareAndSwapLong(Object o, long offset, long expected, object x);
    
    • 1
    • 2
    • 3

    由上面的代码,大家可以看出,所有原子的底层基本都是这三个方法。所以Boolean和其他类型,都是通过转为整型实现的。

    原子更新数组

    AtomicReferencenArray:原子更新引用类型数组的元素
    AtomicIntegerArray:原子更新整型数组的元素
    AtomicLongArray:原子更新长整型数组的元素

    原子更新引用类型

    AutomicReference:原子更新引用类型
    AutomicReferenceFeildUpdater:原子更新引用类型里的字段
    AutomicMarkableReference:原子更新带有标记位的引用类型

    原子更新字段类

    AutomicIntegerFeildUpdater:原子更新引用类型
    AutomicLongFeildUpdater:原子更新引用类型里的字段
    AutomicStampedReference:原子更新带有标记位的引用类型

    这个带版本号的原子更新,就是为了解决著名的ABA问题,除此之外和其他的原子类操作,基本没有任何的区别。

    总结

    原子类的使用比较少见,但是在多线程的环境下,如果可以利用好这个原子类。这个效率会比使用锁要高很多。

  • 相关阅读:
    双链表的基本操作
    Linux中的MFS分布式文件系统
    Java中JCP, JEP, JLS, JSR是什么
    【Redis】redis的特性和使用场景
    位段的声明 以及 分配内存的方式
    DOM property 和 attribute 的区别
    HTTP的长连接(使用selectPage分页获取总页数处理)
    【VUE实战项目】使用typescript重构项目
    双十一什么数码产品值得买?2022双十一值得买的数码好物推荐
    指针与引用
  • 原文地址:https://blog.csdn.net/qq_41820066/article/details/127910008