• 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。

  • 相关阅读:
    QuickSort(Java)
    MergeSort(Java)
    Silverlight中Datagrid添加Button列用于控制单行对象
    二叉搜索树(BST)demo
    svn ignore使用方法
    海量数据处理面试题及解决方法
    Android中的单元测试
    Ubuntu下配置Intellij的Android开发环境
    urlrewrite地址重写之后丢失css和js解决方案
    修改后 简单的 TCP server
  • 原文地址:https://www.cnblogs.com/YDDMAX/p/5645258.html
Copyright © 2020-2023  润新知