首页 > 其他分享 >原子类Atomic

原子类Atomic

时间:2023-02-19 16:24:49浏览次数:33  
标签:var5 var1 变量 CAS 原子 算法 线程 Atomic

前言

非阻塞算法:如果在某种算法中,一个线程的失败或挂起不会导致其他线程也失败或挂起,那么这种算法就被称为非阻塞算法。如果在算法的每个步骤中都存在某个线程执行下去,那么这种算法也被称为无锁(Lock_Free)算法。

原子变量类是Java为支持非阻塞算法而提供的对象。原子变量比锁的粒度更细,并发性能更好,通常在并发场景下进行变量的复合操作时使用,如:i++、if..get等

相关原子类Atomic

  • 基本数据类:AtomicBoolean、AtomicInteger、AtomicLong
  • 引用对象类:AtomicReference
  • 数组类:AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray
  • 属性更新类:AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater
  • 解决ABA问题的类:AtomicStampedReference、AtomicMarkableReference

比较并替换CAS(Compare-and-Swap)

  • 说明:CAS包含了3个操作数:需要读写的内存位置V,进行比较的值A、待更新的值B,当且仅当V的值等于A时,通过原子方式更新V的值为B;当多个线程使用CAS同时更新同一个变量时,只有其中的一个线程能更新成功,其他线程都将失败,失败的线程不会阻塞。
  • 应用场景:Java提供的原子变量类中的复合操作底层均通过CAS技术实现原子操作。
  • 源码分析(以AtomicInteger#getAndIncrement()为例)
//i++的原子操作
public final int getAndIncrement() {
    return unsafe.getAndAddInt(this, valueOffset, 1);
}

public final int getAndAddInt(Object var1, long var2, int var4) {
    int var5;
    do {
        //获取内存中共享变量var1的值
        var5 = this.getIntVolatile(var1, var2);
        //执行底层CAS操作:var1内存位置,var2本地缓存的值,var5共享内存中的值,当且仅当var2=var5时,var1的值更新为var5+var4
    } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

    return var5;
}

ABA问题

  • 问题描述:ABA问题是一种异常现象——如果在算法中的节点可以被循环使用,那么在使用CAS时就可能出现这个问题。如线程1和2同时将变量X的值由A更新为B,线程1先将变量X的值由A改为C再改为A,此时线程2执行CAS更新变量X的值,发现变量X的值是没有变化的,但实际变量X的值已经发生过变化。
  • 解决方案:引入一个变量——版本号,更新时需更新变量的值和版本号。如原子变量类AtomicStampedReference、AtomicMarkableReference。

标签:var5,var1,变量,CAS,原子,算法,线程,Atomic
From: https://www.cnblogs.com/jiangfengan/p/17134934.html

相关文章

  • 多线程计数 AtomicInteger
    大家在工作中肯定遇到过计数统计需求,单线程的情况下count直接定义int型就行,可是在多线程并发下会产生多个线程同时count++的情况,那么这种情况就需要用到AtomicInteger来保......
  • 【Redis】Redis 字符串数据操作 ① ( 访问字符串值数据 | 操作数据库中的字符串数据 |
    文章目录​​一、Redis中的String字符串类型​​​​二、访问字符串值数据​​​​1、设置字符串值数据​​​​2、读取字符串值数据​​​​3、键不存在时设置字符串值......
  • 时钟系统,ZNBase时钟同步技术解析:原子钟实现Ture-time机制
    在分布式数据库系统中,为了解决不同集群、节点事件发生的先后顺序问题,时钟同步至关重要。本文将为大家介绍业界现有的几种主流的时钟同步解决方案,以及分布式数据库ZNBase......
  • 原子操作
    概述原子(atomic)本意是“不能被进一步分割的最小粒子”,而原子操作(atomicoperation)意为“不可被中断的一个或一系列操作”,可以保证指令以原子的方式运行,即执行过程不被打断......
  • CUDA变量存储与原子操作
    引入问题Q:为什么GPU函数内定义的变量无法对GPU函数的传入参数进行赋值,而常量可以进行赋值?需要声明,这个问题出现的时候,这个GPU函数的传入参数是通过cudaMalloc声明的全局......
  • 详细谈谈Java中long和double的原子性
    目录前言JVM中对long的操作是不是原子操作?为什么对long的操作不是原子的?在硬件,操作系统,JVM都是64位的情况下呢?总结 前言java中基本类型中,long和double的长度都......
  • GO 原子操作 atomic包
    原子操作简介原子操作即是进行过程中不能被中断的操作,针对某个值的原子操作在被进行的过程中,CPU绝不会再去进行其他的针对该值的操作。为了实现这样的严谨性,原子操作仅会......
  • C++ atomic的Cacheline及Memory fence问题
    我们都知道多核编程常用锁避免多个线程在修改同一个数据时产生racecondition。当锁成为性能瓶颈时,我们又总想试着绕开它,而不可避免地接触了原子指令。但在实践中,用原子指......
  • atomic
    atomicMutex、RWMutex等并发原语的实现,最底层是通过atomic包中的一些原子操作来实现的.在很多场景中,使用并发原语实现起来比较复杂,而原子操作可以帮助我们更轻松地实......
  • 原子轨道(角向部分)
    classWaveFunc(VGroup):def__init__(self,l:int,m:int,**kwargs......