对 cas 操作的理解
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 操作的理解相关推荐
- java disruptor压测_Java并发框架Disruptor实现原理与源码分析(二) 缓存行填充与CAS操作...
##缓存行填充 关于缓存行填充在我个人的印象里面第一次看到是在Java的java.util.concurrent包中,因为当时很好奇其用法背后的逻辑,所以查了很多资料才明白到底是怎么回事*(也许事实上 ...
- 对CAS机制的理解(二)
一.Java当中CAS的底层实现 首先看看AtomicInteger的源码,AtomicInteger中常用的自增方法 incrementAndGet: public final int increm ...
- 基于 Redis 实现 CAS 操作
基于 Redis 实现 CAS 操作 Intro 在 .NET 里并发情况下我们可以使用 Interlocked.CompareExchange 来实现 CAS (Compare And Swap) ...
- 关于AQS中enq( )方法CAS操作的疑惑
private Node enq(final Node node) {for (;;) {Node t = tail;//如果队列为空则新建头结点if (t == null) { // Must in ...
- 高并发必学的 CAS 操作,看这篇就够了!
大家好,我是树哥. CAS 操作是高并发场景下,性能如此之高的一个重要优化.今天推荐胜哥的一篇关于 CAS 的文章,带你了解 CAS 的前世今生,写得真是太棒了! 背景 在高并发的业务场景下,线程安全 ...
- java中的CAS操作以及锁机制详解
关于CAS操作 CAS:Compare And Swap -- 乐观锁策略 CAS(无锁操作):使用CAS叫做比较交换来判断是否出现冲突,出现冲突就重试当前操作直到不冲突为止. 悲观锁(JDK1 ...
- Java CAS操作的实现原理深度解析与应用案例
首先介绍了CAS的基本概念,然后深入至HotSpot源码级别的角度解析了CAS的底层实现,最后介绍了CAS操作存在的问题以及应用. 文章目录 1 CAS的概述 2 Java的CAS实现 3 CAS的底 ...
- CAS操作与ABA问题
我们在使用锁时,线程获取锁是一种悲观锁策略,即假设每一次执行临界区代码都会产生冲突, 所以当前线程获取到锁的时候同时也会阻塞其他线程获取该锁.而CAS操作(又称为无锁操作)是一种乐观锁策略,它假设所有 ...
- CAS操作和sychronized实现原理
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.CAS 什么是CAS CAS应用: 实现原子类 实现自旋锁 CAS的ABA问题 二.Sychronized实现原理 加锁 ...
最新文章
- 实验十 配置EIGRP协议
- Rabbitmq 极简实现
- 公安网三合一EWSD交换机数据制作
- php7抓取网页数据,php7-远程获取api接口或网页内容
- 深度学习和目标检测系列教程 17-300: 3 个类别面罩检测类别数据集训练yolov5s模型
- VTK:可视化之StreamLines
- as cast float server sql_Sql Server中Float格式转换字符串varchar方法(转)
- eclipse手动添加SVN插件
- Oracle SQL Tips
- 用VB产生随机任意大小文件挤满硬盘
- C#多线程学习1——多线程的相关概念
- js 打印数组_Node.js系列二 - Node基础知识
- http协议-响应和请求
- layer子窗口与父窗口传值
- 结合eXeScope打造个性flash发布后的应用程序exe文件
- python3-爬取cnnvd漏洞库
- 数值计算之 插值法(2)多项式插值——牛顿插值法
- #WPF#Dirkster.AvalonDock教程
- 单例模式详解(线程安全,饿汉,懒汉模式)
- 苹果手机屏幕镜像_苹果手机还能一键投屏?点一下小屏变大屏幕,看剧是真畅快...
热门文章
- hexo的yelee主题文章背景颜色修改
- U25%(1,16) and U25%(1,168)on《C4.5:programs for machine learning》
- 02繁花嗅Django笔记
- leetcode :数组和链表
- SVM(四)KSVM
- php一点按钮就下载功能源码,php实现强制文件下载方法的源码参考
- Php 魔术函数性能,php常用的魔术函数详细解析
- 是什么职位_为什么说,质量工程师岗位变成了 “寡妇职位”?
- ArrayList与数组
- Nginx笔记-处女篇