cas是什么

  CAS 全称 compare and swap 或者compare and exchange  比较并且交换。用于在没有锁的情况下,多个线程对同一个值的更新。

cas原理

  例如,我们对一个int i进行递增操作。原来,为了线程安全,需要在递增代码上加一把锁 sync 。CAS的实现方式为:不去加锁,读取当前的值,将原值存入E中,然后计算,得到计算结果1,这个时候的新值存入V中。然后调用一个比较并交换的方法(底层汇编指令) 这个方法的作用是:如果E和现在的i值相等,说明没有地方对原值进行过操作。那么就将i的值替换为V的值。
  如果有别的线程对i进行操作了(例如:i被修改为了2),那么将i的新值读取,然后再进行一次计算操作(将i=2 作为最初值,进行计算,得到结果3 )。然后再次调用比较并交换的方法,去进行值的更新操作。一直循环,直到更新成功(有的锁在更新到一定次数后,会进行锁升级,但是这个跟CAS没关系)

  CAS底层原理

  cas追代码的时候,可以追到native部分,但是,这里面提供的都是一些接口,但是没有具体的底层实现。具体的实现,需要看虚拟机的实现。

  jvm的底层实现分为不同的公司的不同实现:Oracle的为hotSpot实现,这个是最常见的。我们可以看到代码的开源版本是openjdk。比如阿里的taobaoVM 。Ibm 的J9等。

  在openjdk 中,unsafe类在实现CompareAndSwapInt 方法时,是调用的Atomic类的cmpxchg方法,然后一通方法调用,最终调用到汇编语言的 lock_if_mp(lock  if multi processors 如果是多个cpu 那么会锁定) cmpxchg 这两个 指令 ,最终执行 lock cmpxchg 指令
这里的lock是一一个锁定北桥芯片的锁,用于解决当前cpu在进行比较和修改的时候的其他cpu对该值进行操作的问题。保证线程安全。

aba问题

  在线程A进来时,读取到的值为1。在A进行计算的时候线程B取到了i的值,然后更新为了2。然后线程C又取到i=2的值,进行C的计算后,然后得到结果为1 又将i的值修改为了1 这个时候,线程A进行判断的时候,会认为在其计算过程中没有其他线程对i进行过操作。ABA有的会产生影响,有的不会,如果没有影响,不需要考虑该问题。

aba问题解决

  解决方法:加上版本号,每个线程读取完,赋值的时候,修改版本号,比较的时候,对比i值+版本号。

CAS(乐观锁)与ABA问题的更多相关文章

  1. CAS(乐观锁)以及ABA问题

    https://blog.csdn.net/wwd0501/article/details/88663621独占锁是一种悲观锁,synchronized就是一种独占锁:它假设最坏的情况,并且只有在确保 ...

  2. Java性能 -- CAS乐观锁

    synchronized / Lock / CAS synchronized和Lock实现的同步锁机制,都属于悲观锁,而CAS属于乐观锁 悲观锁在高并发的场景下,激烈的锁竞争会造成线程阻塞,而大量阻塞 ...

  3. [数据库锁机制] 深入理解乐观锁、悲观锁以及CAS乐观锁的实现机制原理分析

    前言: 在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数据库都提供了锁机制,并引入了事务隔离级别的概念.数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务 ...

  4. 并发之ATOMIC原子操作--CAS乐观锁原理(二)

    1.乐观锁介绍 程序完成并发操作时,访问数据时每次不加锁,假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止.就是当去做某个修改或其他操作的时候它认为不会有其他线程来做同样的操作(竞争) ...

  5. redis的高级事务CAS(乐观锁)

    Optimistic locking using check-and-set(乐观锁) 乐观锁介绍:watch指令在redis事物中提供了CAS的行为.为了检测被watch的keys在是否有多个cli ...

  6. Java:CAS(乐观锁)

    本文讲解CAS机制,主要是因为最近准备面试题,发现这个问题在面试中出现的频率非常的高,因此把自己学习过程中的一些理解记录下来,希望能对大家也有帮助. 什么是悲观锁.乐观锁?在java语言里,总有一些名 ...

  7. JAVA多线程学习四 - CAS(乐观锁)

    本文讲解CAS机制,主要是因为最近准备面试题,发现这个问题在面试中出现的频率非常的高,因此把自己学习过程中的一些理解记录下来,希望能对大家也有帮助. 什么是悲观锁.乐观锁?在java语言里,总有一些名 ...

  8. java 乐观锁CAS

    乐观锁是一种思想,本身代码里并没有lock或synchronized关键字进行修饰.而是采用一种version. 即先从数据库中查询一条记录得到version值,在更新这条记录时在where条件中对这 ...

  9. Java并发:乐观锁

    作者:汤圆 个人博客:javalover.cc 简介 悲观锁和乐观锁都属于比较抽象的概念: 我们可以用拟人的手法来想象一下: 悲观锁:像有些人,凡事都往坏的想,做最坏的打算:在java中就表现为,总是 ...

随机推荐

  1. iOS开发MD5、SHA1

    MD5: + (NSString *)md5:(NSString *)input { const char *cStr = [input UTF8String]; unsigned char dige ...

  2. 使用flask实现简单的文件上传

    from flask import Flask, redirect, render_template, request, url_forfrom werkzeug.utils import secur ...

  3. 抛开 Spring ,你知道 MyBatis 加载 Mapper 的底层原理吗?

    原文链接:抛开 Spring ,你知道 MyBatis 加载 Mapper 的底层原理吗? 大家都知道,利用 Spring 整合 MyBatis,我们可以直接利用 @MapperScan 注解或者 @ ...

  4. [JavaWeb基础] 023.线程安全(二)

    上一篇我们讲解了线程安全的问题,那么要解决线程安全的问题,我们就必须用到线程同步,保证线程之间不互相影响而产生脏数据,下面我们来讲讲具体的实现吧. 首先我们看下例子,我们有个Outputter类,用于 ...

  5. [Objective-C] 006_Protocol(协议)

    学过java的同学都知道Interface(接口),那么在Objective-C中有没有接口呢?其实 Objective-C中用Protocol(协议)来实现的,在Objective-C具体怎么用,我 ...

  6. static关键字的应用

    static关键字的应用:使用静态的变量可以实现   "累加" 的效果 package com.aff.statics; public class TestCircle { pub ...

  7. 【转】B树、B+树、B*树、R 树、QuadTree

    从B树.B+树.B*树谈到R 树 QuadTree(四叉树) 四叉树空间索引原理及其实现

  8. Rocket - diplomacy - NodeHandle相关类

    https://mp.weixin.qq.com/s/GWL41P1G1BXm2sTeLmckdA   介绍NodeHandle相关的类.     ​​   1. NoHandle   顶层类(tra ...

  9. jchdl - GSL实例 - DFlipFlop(D触发器)

    https://mp.weixin.qq.com/s/7N3avTxTd2ZUnAcKg4w3Ig   D触发器对边沿敏感,只有当相应的边沿出现时,才会触发D的值传播到输出Q.   ​​ 引自:htt ...

  10. 【HIVE】(3)联合查询join、时间戳函数、字符串函数

    数据 t_join1.txt 1,a,1 2,b,2 3,c,4 t_join2.txt 1,2a 2,2b 3,2c 建表.导入: create table t_join1(id int, name ...