zoukankan      html  css  js  c++  java
  • Java中的13个原子操作类

    1、背景                                                            

    Java从JDK1.5开始提供了java.util.concurrent.atomic包,这个包中的原子操作类提供了一种用法简单,性能高效,线程安全地更新一个变量的方式。

    Atomic包里一共提供了13个类,属于4种类型的原子更新方式,分别是原子更新基本类型,原子更新数组,原子更新引用和原子更新属性

    Atomic包里的类基本都是使用Unsafe实现的包装类。

    2、原子更新基本类型                                          

    Atomic包提供了以下3个类:AtomicBoolean、AtomicInteger、AtomicLong。

    Unsafe只提供了3种CAS方法:compareAndSwapObject、compareAndSwapInt、compareAndSwapLong,再看AtomicBoolean源码,发现它是将Boolean转换成整型,再使用compareAndSwapInt进行CAS,所以原子更新char、float和double变量也可以用类似的思路来实现。

    3、原子更新数组                                                

    Atomic包提供了以下3个类:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray

    4、原子更新引用类型                                          

    Atomic包提供了以下3个类:AtomicReference、AtomicReferenceFieldUpdater、AtomicMarkableReference(原子更新带有标记位的引用类型。可以原子更新一个布尔类型的标记位和引用类型。

    5、原子更新字段类                                                                              

     Atomic包提供了以下3个类:AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicStampedFieldUpdater(更新带有版本号的引用类型)

    要想原子地更新字段类需要两步。第一步,因为原子更新字段类都是抽象类,每次使用的时候必须使用静态方法newUpdater()创建一个更新器,并且需要设置想要更新的类和属性。第二步,更新类的字段必须使用public volatile修饰符。

  • 相关阅读:
    使用C#调用C++类库
    C# IntPtr类型
    C# 调用C++ dll string类型返回
    C# try、catch、finally语句
    C语言 char *、char []、const char *、string的区别与相互转换
    C# 字符串string与char数组互转!
    C#如何调用C++(进阶篇)
    Springboot通过过滤器实现对请求头的修改
    【spring事务】
    命令行参数库:McMaster.Extensions.CommandLineUtils【转】
  • 原文地址:https://www.cnblogs.com/fankongkong/p/7289421.html
Copyright © 2011-2022 走看看