这三个单词算是多线程面试常见的问题了,也是很多小白不太懂的问题,这里给出我的理解来。

一.CAS

J.U.C 并发包中的很多类都涉及到了 CAS,可以说没有 CAS 和 volatile 就没有 J.U.C 并发包,可见CAS是多么的重要。

1、什么是CAS

CAS其实并不是一种工具或者被很多人认为的与”乐观锁”等价的东西,CAS是一种算法,它的基本思想就是拿着预期数A与内存数V比较,如果A和V相同,那么则证明V没有被修改,把它修改为想要写入的数B,如果不同则返回。

2、CAS解决的场景

我们都知道JMM是线程与主内存的一层抽象,也就是每个线程都有自己的本地内存,每个线程都会先更新自己的本地内存,然后再把新值刷新到主内存中,那么问题来了,所有的线程都想要同步更新到主内存中

CAS就是为了保证这种情况下线程安全的。所有线程当都想更新主内存中同一个变量时,会使用CAS算法,确保只有一个线程更新成功,其他线程会自旋重试。

3、CAS的问题

因为CAS是让失败的线程尝试自旋等待,所以带来的第一个问题就是自旋导致CPU性能下降,而第二个问题就是接下来要讲的ABA问题了

二.ABA

1、什么是ABA问题

CAS的第一步就是对预期值和内存数进行比较,但是并不清楚这个数有没有真正地被改过,也可能同一个线程从A改成了B又改成A,有的需求只在乎结果可能影响不大,但有的需求对中间过程也很在意,这样就会带来了问题

2、解决ABA问题

解决ABA问题也很简单,采取类似数据库乐观锁实现的方式,加一个时间戳,通过时间戳或者版本号来判断有没有改变过

三.AQS

AQS是一个抽象类,是构建锁和其他协作类的一个框架,它的核心主要是三个部分,一个是state,这个是int类型,在不同的协作类中有不同的含义,比如在Semaphore中就是许可证的含义,在ReentrantLock中就是锁的状态,第二个就是FIFO队列,这个就是线程阻塞时排队工作,第三个就是获取/释放方法,在不同实现中也是不尽相同的。

如果看源码的话,比如Semaphore或者countdownLatch或者其他工具类,它们的源码中都有一个实现AQS接口的sync的内部类,这个内部类就是实现各自工具类中的一些各自的特性,如果点进AQS源码看,有一些是被fianl修饰的,说明不能被修改,而有一些则是可以修改的,各自内部类可以重写这些方法,实现自己的逻辑。

AQS有两种模式,看源码就会发现,有的方法后面会跟着share的字眼,所以就分为了独占模式和共享模式。

多线程基础之CAS、AQS、ABA辨析的更多相关文章

  1. 沉淀再出发:java中的CAS和ABA问题整理

    沉淀再出发:java中的CAS和ABA问题整理 一.前言 在多并发程序设计之中,我们不得不面对并发.互斥.竞争.死锁.资源抢占等等问题,归根到底就是读写的问题,有了读写才有了增删改查,才有了所有的一切 ...

  2. 三、多线程基础-自旋_AQS_多线程上下文

    1. 自旋理解    很多synchronized里面的代码只是一些很简单的代码,执行时间非常快,此时等待的线程都加锁可能是一种不太值得的操作,因为线程阻塞涉及到用户态和内核态切换的问题.既然sync ...

  3. java并发编程(十三)----(JUC原子类)引用类型介绍(CAS和ABA的介绍)

    这一节我们将探讨引用类型原子类:AtomicReference, AtomicStampedRerence, AtomicMarkableReference.AtomicReference的使用非常简 ...

  4. CAS及其ABA问题

    CAS.volatile是JUC包实现同步的基础.Synchronized下的偏向锁.轻量级锁的获取.释放,lock机制下锁的获取.释放,获取失败后线程的入队等操作都是CAS操作锁标志位.state. ...

  5. Java高性能编程之CAS与ABA及解决方法

    Java高性能编程之CAS与ABA及解决方法 前言 如果喜欢暗色调的界面或者想换换界面,可以看看我在个人博客发布的 Java高性能编程之CAS与ABA及解决方法. CAS概念 CAS,全称Compar ...

  6. CAS的ABA问题详解

    CAS的ABA问题详解 ABA问题 在多线程场景下CAS会出现ABA问题,关于ABA问题这里简单科普下,例如有2个线程同时对同一个值(初始值为A)进行CAS操作,这三个线程如下 1.线程1,期望值为A ...

  7. CAS 和 ABA 问题

    CAS简介 CAS 全称是 compare and swap,是一种用于在多线程环境下实现同步功能的机制. CAS 它是一条CPU并发原语.操作包含三个操作数 -- 内存位置.预期数值和新值.CAS ...

  8. Java并发编程入门与高并发面试(三):线程安全性-原子性-CAS(CAS的ABA问题)

    摘要:本文介绍线程的安全性,原子性,java.lang.Number包下的类与CAS操作,synchronized锁,和原子性操作各方法间的对比. 线程安全性 线程安全? 线程安全性? 原子性 Ato ...

  9. 源码分析:同步基础框架——AbstractQueuedSynchronizer(AQS)

    简介 AQS 全称是 AbstractQueuedSynchronizer,位于java.util.concurrent.locks 包下面,AQS 提供了一个基于FIFO的队列和维护了一个状态sta ...

  10. Java基础知识笔记(四:多线程基础及生命周期)

    一.多线程基础 编写线程程序主要是构造线程类.构造线程类的方式主要有两种,一种是通过构造类java.lang.Thread的子类,另一种是通过构造方法实现接口java.lang.Runnable的类. ...

随机推荐

  1. 五一训练包E-5

    题目链接:https://vjudge.net/contest/436484#problem/E 题目的大致意思就是给俩数,分别是小数组的大小N和数目K,给的数组是递增的,方便后续的判断,将大数组分成 ...

  2. stm32 微秒定延时问题

    problem: 如果想用计时器定时微秒级,不要使能自动重载:代码如下: static uint16_t counter; void Delay_us(uint32_t us){ counter=0x ...

  3. WEB攻击与防御技术 pikachu——sql注入

    如图所示,sql注入 一.数字型注入 既然是post那我们拿burp抓一下包 id=2,我们改一下sql最常用的语句2 or 1=1发现注入成功 二.字符型注入 直接上语句1' or 1=1 # 出来 ...

  4. epoll 基本知识与使用

    https://blog.csdn.net/qq_35721743/article/details/86742508 epoll 最大的好处在于它不会随着监听 fd 数目的增长而降低效率. epoll ...

  5. xmake构建C/C++编译环境

    1. xmake介绍 XMake是一个基于Lua的轻量级跨平台自动构建工具,支持在各种主流平台上构建项目 xmake的目标是开发者更加关注于项目本身开发,简化项目的描述和构建,并且提供平台无关性,使得 ...

  6. Vue3 + echarts 统一封装

    1. 新建 echartsLib.js 文件,统一导入需要的组件 import * as echarts from "echarts/core"; import { SVGRend ...

  7. 【jmeter】请求域名解析失败,添加本地代理

    jmeter HTTP请求URL中使用域名 http://xxx.xxx.xxx,异常:java.net.UnkownHostException 原因:请求域名没有被解析成功,该http请求没有通过本 ...

  8. Debug --> 攻击方式

    1.CSRF攻击概述: CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一. CSRF攻击原 ...

  9. GIMP选择,GIMP画布大小,GIMP图层

    基本概念 1. 画布 2. 图层 你只能操作一个图层--就是你选中的.就看起来所有的图像都在一起,但是不同的图层中的图像是不同,不能操作没有选中的图层. 对于选择操作,要注意你选中的图层. 要获取图像 ...

  10. Linux deploy 32位系统 怎么安装宝塔怎么安装linux系统安装宝塔后搭建网站

    getconf LONG_BIT 获取当前linux系统位数