CAS:什么是 CAS 机制?
cas目的是实现原子操作解释一下:
"原子操作(atomic operation)是不需要synchronized",这是多线程编程的老生常谈了。所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切 [1] 换到另一个线程)。 这是百度百科的解释
意思就是这个状态不会被中间态打断,例如银行转账机制,一个账号扣钱了,收钱账户也一定要收钱,不能中断
在java中原子操作 用于多线程的操作场景避免一个共享变量没有达到预期值

参见一个例子不安全场景:

这个结果 count不一定是200,因为存在多线程的竞争问题可能小于200,如果把run方法里面 加上synchronized代码块后每个线程的运行的状态不会受别的线程影响,实现了原子操作,最中结果一定是200.

java.util.concurrent.atomic包下 有一系列原子类

这中操作最后也是200,因为原子类专门解决了这个问题

java.util.concurrent.atomic 包下的类就是解决CAS的问题的,都是原子类。

原子类中的value 利用了volatile 实现的变量值共享。

,核心原理是:CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。

每次更新的时候旧值都要与内存值比较,不一致会更新失败,然后利用内存值继续更新(出现了自旋操作,在高并发下比较危险会严重消耗cpu资源)

比如第二个线程运行到97的时候 第一个线程由于反应较慢才运行到5那么当5自增的时候一定会失败内存值与旧值不一致,所以进行自旋从97开始到98,第二个线程开始运行98旧值是97所以也会失败开始自旋到98,以此类推就实现了交替自增最终结果是200.

参见:https://ss.csdn.net/p?https://mmbiz.qpic.cn/mmbiz_jpg/NtO5sialJZGpfMM4tNG7D3k05o337rpShibke60ZSQ8jQuoQMdXK7fcyLkkDGS2EfOiahzQQS9DPHmjsXcB8ibWKdg/0?wx_fmt=jpeg

图文并茂的讲解。

cas是乐观锁,synchronized 是悲观锁,  在大并发下synchronized 的使用要比cas好些(CAS自旋的概率会比较大,从而浪费更多的CPU资),并发不大的时候cas性能好(不需要切换线程,操作自旋几率较少)

cas存在的问题:

ABA问题,如果 一个值是A, 被线程2变成了B, 被线程2或者其它的线程又给变回了A, 那么此时线程1操作的时候检查到的还是A,就认为没有变化,则执行更新,

AtomicStampedReference类解决了该问题,加入了版本号的解决方式。类似数据库的乐观锁加入版本号机制。

只能保证一个共享变量的原子操作,AtomicReference类能够满足多个变量的原子操作。

java 的CAS的更多相关文章

  1. 【Java】CAS的乐观锁实现之AtomicInteger源码分析

    1. 悲观锁与乐观锁 我们都知道,cpu是时分复用的,也就是把cpu的时间片,分配给不同的thread/process轮流执行,时间片与时间片之间,需要进行cpu切换,也就是会发生进程的切换.切换涉及 ...

  2. Java中CAS原理详解

    在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2 ...

  3. Java中CAS详解

    在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2 ...

  4. 多线程之:java的CAS操作的相关信息

    一:锁机制存在的性能问题? 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁(后面的章节还会谈到锁). 锁机制存在以下问题:(1)在多线程竞争下,加锁.释放锁会导 ...

  5. java面试-CAS底层原理

    一.CAS是什么? 比较并交换,它是一条CPU并发原语. CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B.当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什 ...

  6. Java并发——CAS

    什么是CAS? CAS是Compare And Swap的简称.在Java中有很多实现,比如compareAndSwapObject()方法,或者compareAndSwapInt()方法等.多用在包 ...

  7. 详解java中CAS机制所导致的问题以及解决——内存顺序冲突

    [CAS机制] 指的是CompareAndSwap或CompareAndSet,是一个原子操作,实现此机制的原子类记录着当前值的在内存中存储的偏移地址,将内存中的真实值V与旧的预期值A做比较,如果不一 ...

  8. Java自定义cas操作

    java Unsafe工具类提供了一个方法 public final native boolean compareAndSwapObject(Object var1, long var2, Objec ...

  9. java多线程-cas及atomic

    大纲: cas atomic 一.cas cas:compareAndSwap,一种乐观锁. cas思想:cas需要三个值,v是内存值,e是期望值,n是要修改的值.当内存中的值v等于预期值e(说明内存 ...

  10. Java性能 -- CAS乐观锁

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

随机推荐

  1. 抓DHCP客户端ip脚本

    cat testnew.sh #!/bin/bash catch_ip (){Ip=`sudo nmap -sP 192.168.1.0/24 |grep -i -B2 $mac|grep Nmap ...

  2. 【从0到1学算法】大O表示法

    一般我们在选择算法时,都是想要选择效率最高的算法.那算法的效率,用什么表示?没错!就是用大O表示法. PS: 大O表示法中,log即为log2,后面不再说明. 下面以简单查找和二分查找,在含有n个元素 ...

  3. fastreport小入门

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  4. nodejs(14)express获取url中的参数

    问号传参获取参数 获取 http://127.0.0.1:3001/user?id=10&name=zs 中的查询参数: 直接使用 req.query 获取参数即可: 注意:URL 地址栏中通 ...

  5. python刷LeetCode:3.无重复字符的最长子串

    难度等级:中等 题目描述: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 ...

  6. array_flip() 函数返回一个反转后的数组

    定义和用法 array_flip() 函数返回一个反转后的数组,如果同一值出现了多次,则最后一个键名将作为它的值,所有其他的键名都将丢失. 如果原数组中的值的数据类型不是字符串或整数,函数将报错 ar ...

  7. 三、VIP课程:并发编程专题->01-并发编程之Executor线程池详解

    01-并发编程之Executor线程池详解 线程:什么是线程&多线程 线程:线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系 ...

  8. vscode template中设置不换行

    { "workbench.colorTheme": "Dark-Dracula", "workbench.iconTheme": " ...

  9. day66-CSS伪类选择器和伪元素选择器

    1. 伪类选择器:hover 和 focus 比较常用. 1.1 hover:把鼠标移动到内容迈腾2020款TSI DSG舒适型的时候,字体变成了红色. html: <body> < ...

  10. 基于redis实现锁控制

    多数据源 数据源1为锁控制,数据源2自定义,可用于存储. 锁:当出现并发的时候为了保证数据的一致性,不会出现并发问题,假设,用户1修改一条信息,用户2也同时修改,会按照顺序覆盖自修改的值,为了避免这种