前言

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

原子类Atomic的更多相关文章

  1. 什么是原子操作?在 Java Concurrency API 中有哪些原 子类(atomic classes)?

    原子操作(atomic operation)意为"不可被中断的一个或一系列操作" . 处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作. 在 Java 中可以通 ...

  2. 原子类 Atomic

    @Testpublic void testAtomicBoolean() { AtomicBoolean atomicBoolean = new AtomicBoolean(); boolean b ...

  3. Atomic原子类

    Atomic原子类 Atomic原子类位于并发包java.util.concurrent下的java.util.concurrent.Atomic中. 1. 原子更新基本类型类 使用原子方式更新基本数 ...

  4. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  5. 原子类java.util.concurrent.atomic.*原理分析

    原子类java.util.concurrent.atomic.*原理分析 在并发编程下,原子操作类的应用可以说是无处不在的.为解决线程安全的读写提供了很大的便利. 原子类保证原子的两个关键的点就是:可 ...

  6. Java CAS同步机制 原理详解(为什么并发环境下的COUNT自增操作不安全): Atomic原子类底层用的不是传统意义的锁机制,而是无锁化的CAS机制,通过CAS机制保证多线程修改一个数值的安全性。

    精彩理解:  https://www.jianshu.com/p/21be831e851e ;  https://blog.csdn.net/heyutao007/article/details/19 ...

  7. Juc中Atomic原子类总结

    1 Atomic原子类介绍 2 基本类型原子类 3 数组类型原子类 4 引用类型原子类 5 对象的属性修改类型原子类

  8. (转)Java atomic原子类的使用方法和原理(一)

    在讲atomic原子类之前先看一个小例子: public class UseAtomic { public static void main(String[] args) { AtomicIntege ...

  9. [Java多线程]-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  10. Java并发—原子类,java.util.concurrent.atomic包(转载)

    原子类 Java从JDK 1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中 的原子操作类提供了一种用法简单.性能高效.线程安全地更新一个变量 ...

随机推荐

  1. 详记apache-poi的使用,将word,excel,ppt转换为html

    原文:https://blog.51cto.com/yunyaniu/5210961 java:Java的jar包之POI的简介.安装.使用方法(基于POI的转换-Word.Excel.Ppt等转ht ...

  2. 微软跨平台maui开发chatgpt客户端

    image 什么是maui .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动(ios,andriod)和桌面(windows,mac)应 ...

  3. VC实例和VM实例的区别!!!

    1.内置关系是什么 VueComponent.prototype.__proto__ === Vue.prototype 2.为什么要有这个关系 让组件实例对象可以访问到 Vue原型上的属性.方法.

  4. 【Azure 云服务】为Azure云服务配置上自签名的SSL证书步骤

    问题描述 在使用Azure Cloud Service(云服务),默认的情况下都是使用的 HTTP 服务,通过 Visual Studio 2022 创建的默认 Cloud Service项目中,在S ...

  5. 关于jQuery的操作

    jQuery简介  简化了JS  ​ 类似于 后端 JDBC(操作数据库的基本API)   dbutils(封装JDBC)     xxx.jar 前端 JS                     ...

  6. CH334、CH335USB2.0Hub芯片(更新ing)

    USB HUB又称USB集线器,主要用于USB主机端口扩展,广泛应用于计算机,笔记本,及周边应用.CH334.CH335是符合 USB2.0 协议规范的高性能MTT 4 端口 USB2.0  HUB  ...

  7. 痞子衡嵌入式:Farewell, 我的写博故事2022

    -- 题图:苏州荷塘月色 2022 年的最后一天,写个年终总结.困扰大家三年之久的新冠疫情终于在 12 月全面放开了,痞子衡暂时还没有阳,计划坚持到总决赛.对于 2023 年,痞子衡还是充满期待的,慢 ...

  8. bbs项目(部分讲解)

    文章评论业务完善 提交评论 评论框里面的内容会清空 然后页面会有一个临时评论样式出现 页面刷新才会出现评论楼样式 研究子评论特性 每个评论右侧都应该有回复按钮 点击就可以填写子评论 点击回复按钮具体动 ...

  9. P5380 [THUPC2019]鸭棋

    题面 查看题面 题目背景 鸭棋是一种风靡鸭子界的棋类游戏.事实上,它与中国象棋有一些相似之处,但规则不尽相同.在这里,我们将为你介绍鸭棋的规则. 鸭棋在一个 \(10\times 9\)(\(10\) ...

  10. SICP:复数的直角和极坐标的表示(Python实现)

    绪论 我们已经介绍过数据抽象,这是一种构造系统的方法学,它能够使程序中的大部分描述与其所操作的数据对象的具体表示无关,比如一个有理数程序的设计与有理数的实现相分离.这里的关键是构筑数据抽象屏障--在有 ...