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

    自己的总结:

       1、原子类的核心是循环CAS,其中CAS使用的是unsafe类里面的3种CAS。

       2、原子类共分为4类

       3、CAS会带来ABA问题,所以直接使用原子类也有ABA问题。但是使用AtomicStampedReference  可以解决这个问题。

       4、自己对CAS的理解:含义像下面的代码那样,if然后set,但是没有加锁,可以多线程同时执行。

    synchanized(this){
    
    if(param==1)
       set(2);
    }

       5、原子类里面的实现value都是volatile。

       6、问题见下面的红色标记

    前言:

        java.util.concurrent.atomic包里面提供的原子操作类提供了一种用法简单、简单高效、线程安全的更新一个变量的方式。

        问题:原子类的核心是循环CAS,使用了unsafe里面的CAS,为什么就高效了?

    1、原子更新基本类型类(只有3个)

        AtomicInteger

       AtomicBoolean

       AtomicLong

       核心实现是使用了unsafe的循环CAS。

       unsafe也只提供了3种CAS:compareAndSwapObject,compareAndSwapInt,compareAndSwapLong

       因为原子操作类只支持3种,其他的基本类型可以使用这三个代替。

        问题:lazySet()

    2、原子更新数组

      AtomicIntegerArray

       AtomicLongArray

       AtomicReferenceArray

       构造方法传入的是个数组,原子类会复制一个数组。

    3、原子更新引用类型

       AtomicReference

       AtomicReferenceFieldUpdater

       AtomicMarkableReference

    4、原子更新字段类

       AtomicIntegerFieldUpdater

        AtomicLongFieldUpdater

        AtomicStampedReference  可以解决CAS的ABA问题

       问题: 更新的字段为什么需要设置成volatile?

       答:原子类里面的value都是volatile的,所以此处也需要volatile。

  • 相关阅读:
    Maven环境搭建、调试、打包
    JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解
    Activiti工作流引擎核心介绍
    NodeJS概述
    JRE集成到Tomcat
    ORACLE递归查询(适用于ID,PARENTID结构数据表)
    爬虫入门——02
    爬虫入门——01
    利用java.lang.reflect.Constructor动态实例化对象
    【java入门点滴】向上转型与向下转型
  • 原文地址:https://www.cnblogs.com/YDDMAX/p/5645258.html
Copyright © 2011-2022 走看看