java 的CAS
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.
图文并茂的讲解。
cas是乐观锁,synchronized 是悲观锁, 在大并发下synchronized 的使用要比cas好些(CAS自旋的概率会比较大,从而浪费更多的CPU资),并发不大的时候cas性能好(不需要切换线程,操作自旋几率较少)
cas存在的问题:
ABA问题,如果 一个值是A, 被线程2变成了B, 被线程2或者其它的线程又给变回了A, 那么此时线程1操作的时候检查到的还是A,就认为没有变化,则执行更新,
AtomicStampedReference类解决了该问题,加入了版本号的解决方式。类似数据库的乐观锁加入版本号机制。
只能保证一个共享变量的原子操作,AtomicReference类能够满足多个变量的原子操作。
java 的CAS的更多相关文章
- 【Java】CAS的乐观锁实现之AtomicInteger源码分析
1. 悲观锁与乐观锁 我们都知道,cpu是时分复用的,也就是把cpu的时间片,分配给不同的thread/process轮流执行,时间片与时间片之间,需要进行cpu切换,也就是会发生进程的切换.切换涉及 ...
- Java中CAS原理详解
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2 ...
- Java中CAS详解
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2 ...
- 多线程之:java的CAS操作的相关信息
一:锁机制存在的性能问题? 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁(后面的章节还会谈到锁). 锁机制存在以下问题:(1)在多线程竞争下,加锁.释放锁会导 ...
- java面试-CAS底层原理
一.CAS是什么? 比较并交换,它是一条CPU并发原语. CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B.当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什 ...
- Java并发——CAS
什么是CAS? CAS是Compare And Swap的简称.在Java中有很多实现,比如compareAndSwapObject()方法,或者compareAndSwapInt()方法等.多用在包 ...
- 详解java中CAS机制所导致的问题以及解决——内存顺序冲突
[CAS机制] 指的是CompareAndSwap或CompareAndSet,是一个原子操作,实现此机制的原子类记录着当前值的在内存中存储的偏移地址,将内存中的真实值V与旧的预期值A做比较,如果不一 ...
- Java自定义cas操作
java Unsafe工具类提供了一个方法 public final native boolean compareAndSwapObject(Object var1, long var2, Objec ...
- java多线程-cas及atomic
大纲: cas atomic 一.cas cas:compareAndSwap,一种乐观锁. cas思想:cas需要三个值,v是内存值,e是期望值,n是要修改的值.当内存中的值v等于预期值e(说明内存 ...
- Java性能 -- CAS乐观锁
synchronized / Lock / CAS synchronized和Lock实现的同步锁机制,都属于悲观锁,而CAS属于乐观锁 悲观锁在高并发的场景下,激烈的锁竞争会造成线程阻塞,而大量阻塞 ...
随机推荐
- 吴裕雄--天生自然MySQL学习笔记:MySQL 临时表
MySQL 临时表在我们需要保存一些临时数据时是非常有用的.临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间. MySQL临时表只在当前连接可见,如果使用PHP脚本来创建My ...
- Cf水题B - Combination
地址: https://vjudge.net/problem/27861/origin Ilya plays a card game by the following rules. A player ...
- OpenCV和Qt的图像格式互转
做图像处理的时候经常使需要用到opencv的,这应该是免费的图像处理库中用得最广泛而且最好用的库了吧.然后有时候想用界面来展示点东西的时候,我们就需要编写个界面,编写界面的方法千千万,弱水三千我只取一 ...
- Hexo博客NexT主题美化之评论系统
前言 更多效果展示,请访问我的博客 https://kangmingxian.github.io/ 效果图: image Valine 诞生于2017年8月7日,是一款基于Leancloud的快速 ...
- CMake工具总述
CMake是一个跨平台的安装工具,可以用简单的语句来描述所有平台的安装. CMake的文件为.cmake文件与CMakeLists.txt文件;通过编写上述两种文件就可以完成源程序的安装.
- linux文件软链接与硬链接
1.命令格式: ln [参数][源文件或目录][目标文件或目录] 软链接只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间. 2.命令功能: Linux文件系统中,有所谓的链接(link),我们 ...
- Spring MVC中防止csrf攻击
Spring MVC中防止csrf攻击的拦截器示例 https://blog.csdn.net/qq_40754259/article/details/80510088 Spring MVC中的CSR ...
- 【按位dp】文盲的学习方法
当年大神的文章 <浅谈数位统计问题> 对于没什么文化(x 没有充分时间或懒得看那么多理论 应付个水考试的我 eg:62问题 某大大的代码和分析 #include <iostream& ...
- css 传数据套路
<input type=hidden> 那么该标签就不会显示 但是我们可以用这个标签储存数据 这是一个利用标签元素隐藏
- CSS公共样式模版
CSS文件命名为global.css,一般此CSS文件是用于装全站主要框架CSS样式代码和初始化的CSS样式. 通常会放初始化CSS代码如下: body, div, ul, ol, dl, dt, d ...