cas官方说明:

Compare and Swap,比较并操作,CPU指令,在大多数处理器架构,包括IA32、Space中采用的都是CAS指令,CAS的语义是“我认为V的值应该为A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际为多少”,CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

cas 是操作系统指令,目前绝大多数处理器使用这个指令架构。

cas 是通过锁cpu 的核的高速缓存或者地址总线(锁地址总线是针对多cpu的分布式系统)实现的。
cas 是一套指令。

通过一个cas操作执行一个指令,首先,这一套指令的第一条是要获取目标值放入在对应的缓存中。

但是此时:有线程去回写内存的某一个地址的时候,其他线程的操作是不能获取cas 目标值的。只有等这个操作结束,才能执行cas操作.  这是其一。

cas操作最根本的是针对并发,很多内核或者线程已经同时获取到目标值,接着就是执行操作,然后写回内存。在写回去,又会再一次获取目标值,比对之前记录的目标值是不是一样,一样就基于目标值操作。否则更新目标值,直到目标值比对结果一样,那么就基于最新的目标值操作(不断尝试,最终肯定操作成功)。
可见cas 其二的关键因子:跟近目标值,将其他线程的同步操作进行更新,然后操作。

cas 本质上也有锁,因为某一cpu或者线程正在操作值,恰恰另外的cpu也要进行操作,但是需要先获取目标值那么此时是不能获取目标值的,因为,cas对应的保护地址在操作中,其他cpu一旦又操作,地址将被锁住,或者缓存将被锁住。cas有对应的地址被记录而加锁保护,这种锁基于硬件的。

cas是硬件指令,c层代码可以调用,java层无法直接调用。

使用java 模拟cas操作:

public class CASCount implements Runnable {private SimilatedCAS counter = new SimilatedCAS();  @Overridepublic void run() {for (int i = 0; i < 10000; i++) {  System.out.println(this.increment());  }  }public int increment() {int oldValue = counter.getValue();int newValue = oldValue + 1;while (!counter.compareAndSwap(oldValue, newValue)) { //如果CAS失败,就去拿新值继续执行CASoldValue = counter.getValue();  newValue = oldValue + 1;  }return newValue;}public static void main(String[] args) {  Runnable run = new CASCount();  new Thread(run).start();  new Thread(run).start();  new Thread(run).start();  new Thread(run).start();  new Thread(run).start();  new Thread(run).start();  new Thread(run).start();  new Thread(run).start();  new Thread(run).start();  new Thread(run).start();  }
}
class SimilatedCAS {private int value;public int getValue() {return value;}// 这里只能用synchronized了,毕竟无法调用操作系统的CAS  public synchronized boolean compareAndSwap(int expectedValue, int newValue) {  if (value == expectedValue) {  value = newValue;  return true;  }  return false;  }
}

对 cas 操作的理解相关推荐

  1. java disruptor压测_Java并发框架Disruptor实现原理与源码分析(二) 缓存行填充与CAS操作...

    ##缓存行填充 关于缓存行填充在我个人的印象里面第一次看到是在Java的java.util.concurrent包中,因为当时很好奇其用法背后的逻辑,所以查了很多资料才明白到底是怎么回事*(也许事实上 ...

  2. 对CAS机制的理解(二)

    一.Java当中CAS的底层实现 首先看看AtomicInteger的源码,AtomicInteger中常用的自增方法 incrementAndGet: public final int increm ...

  3. 基于 Redis 实现 CAS 操作

    基于 Redis 实现 CAS 操作 Intro 在 .NET 里并发情况下我们可以使用 Interlocked.CompareExchange 来实现 CAS (Compare And Swap) ...

  4. 关于AQS中enq( )方法CAS操作的疑惑

    private Node enq(final Node node) {for (;;) {Node t = tail;//如果队列为空则新建头结点if (t == null) { // Must in ...

  5. 高并发必学的 CAS 操作,看这篇就够了!

    大家好,我是树哥. CAS 操作是高并发场景下,性能如此之高的一个重要优化.今天推荐胜哥的一篇关于 CAS 的文章,带你了解 CAS 的前世今生,写得真是太棒了! 背景 在高并发的业务场景下,线程安全 ...

  6. java中的CAS操作以及锁机制详解

    关于CAS操作 CAS:Compare And Swap   --  乐观锁策略 CAS(无锁操作):使用CAS叫做比较交换来判断是否出现冲突,出现冲突就重试当前操作直到不冲突为止. 悲观锁(JDK1 ...

  7. Java CAS操作的实现原理深度解析与应用案例

    首先介绍了CAS的基本概念,然后深入至HotSpot源码级别的角度解析了CAS的底层实现,最后介绍了CAS操作存在的问题以及应用. 文章目录 1 CAS的概述 2 Java的CAS实现 3 CAS的底 ...

  8. CAS操作与ABA问题

    我们在使用锁时,线程获取锁是一种悲观锁策略,即假设每一次执行临界区代码都会产生冲突, 所以当前线程获取到锁的时候同时也会阻塞其他线程获取该锁.而CAS操作(又称为无锁操作)是一种乐观锁策略,它假设所有 ...

  9. CAS操作和sychronized实现原理

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.CAS 什么是CAS CAS应用: 实现原子类 实现自旋锁 CAS的ABA问题 二.Sychronized实现原理 加锁 ...

最新文章

  1. 实验十 配置EIGRP协议
  2. Rabbitmq 极简实现
  3. 公安网三合一EWSD交换机数据制作
  4. php7抓取网页数据,php7-远程获取api接口或网页内容
  5. 深度学习和目标检测系列教程 17-300: 3 个类别面罩检测类别数据集训练yolov5s模型
  6. VTK:可视化之StreamLines
  7. as cast float server sql_Sql Server中Float格式转换字符串varchar方法(转)
  8. eclipse手动添加SVN插件
  9. Oracle SQL Tips
  10. 用VB产生随机任意大小文件挤满硬盘
  11. C#多线程学习1——多线程的相关概念
  12. js 打印数组_Node.js系列二 - Node基础知识
  13. http协议-响应和请求
  14. layer子窗口与父窗口传值
  15. 结合eXeScope打造个性flash发布后的应用程序exe文件
  16. python3-爬取cnnvd漏洞库
  17. 数值计算之 插值法(2)多项式插值——牛顿插值法
  18. #WPF#Dirkster.AvalonDock教程
  19. 单例模式详解(线程安全,饿汉,懒汉模式)
  20. 苹果手机屏幕镜像_苹果手机还能一键投屏?点一下小屏变大屏幕,看剧是真畅快...

热门文章

  1. hexo的yelee主题文章背景颜色修改
  2. U25%(1,16) and U25%(1,168)on《C4.5:programs for machine learning》
  3. 02繁花嗅Django笔记
  4. leetcode :数组和链表
  5. SVM(四)KSVM
  6. php一点按钮就下载功能源码,php实现强制文件下载方法的源码参考
  7. Php 魔术函数性能,php常用的魔术函数详细解析
  8. 是什么职位_为什么说,质量工程师岗位变成了 “寡妇职位”?
  9. ArrayList与数组
  10. Nginx笔记-处女篇