CAS(Compare and Swap)理解
什么叫CAS(Compare and Swap)?
硬件同步原语!! 什么蛋疼的名字,一般人很难理解。根据英文全称翻译==比较与交换,这个名字大致还能理解一点,目前先暂且这么理解吧.
有啥用处?
对于常用多线程编程的人估计知道,对于一般人估计都不曾听说。在jdk5之前,我们知道,在多线程编程的时候,为了保证多个线程对一个对象同时进行访问时,我们需要加同步锁synchronized,保证对象的在使用时的正确性,但是加锁的机制会导致如下几个问题
1.加多线程竞争下,加锁和释放锁会导致较多的上下文切换,引起性能问题。
2.多线程可以导致死锁的问题。
3.多线程持有的锁会导致其他需要此锁的线程挂起。
4......
有更好的办法么?
锁的分类:独占锁(悲观锁),乐观锁
独占锁:synchronized就是一种独占锁,它会导致所有需要此锁的线程挂起,等待锁的释放。
乐观锁:每次不加锁去完成操作,如果因为冲突失败就重试,直到成功。
CAS的机制就相当于这种(非阻塞算法),CAS是由CPU硬件实现,所以执行相当快.CAS有三个操作参数:内存地址,期望值,要修改的新值,当期望值和内存当中的值进行比较不相等的时候,表示内存中的值已经被别线程改动过,这时候失败返回,当相等的时候,将内存中的值改为新的值,并返回成功。
java 中代码实现
在 java.util.concurrent.atomic包中可以查看源代码的实现,这里参java.util.concurrent.atomic.AtomicLong源代码,贴出核心代码:
//+1操作public final long getAndIncrement() {while (true) {long current = get();long next = current + 1;//当+1操作成功的时候直接返回,退出此循环if (compareAndSet(current, next))return current;}}//调用JNI实现CASpublic final boolean compareAndSet(long expect, long update) {return unsafe.compareAndSwapLong(this, valueOffset, expect, update);}
转载于:https://www.cnblogs.com/longshiyVip/p/5205689.html
CAS(Compare and Swap)理解相关推荐
- 猫头鹰的深夜翻译:Java中的CAS(Compare And Swap)
题目要求 在我们深入了解CAS(Compare And Swap)策略以及它是如何在AtomicInteger这样的原子构造器中使用的,首先来看一下这段代码: public class MyApp { ...
- 非阻塞同步算法与CAS(Compare and Swap)无锁算法
锁(lock)的代价 锁是用来做并发最简单的方式,当然其代价也是最高的.内核态的锁的时候需要操作系统进行一次上下文切换,加锁.释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放. ...
- CAS(Compare and swap)比较并交换算法解析
CAS说明 CAS全称是Compare and swap.字面翻译的意思就是比较并交换. CAS可以用来实现乐观锁,CAS中没有线程的上下文切换,减少了不必要的开销 说明:本文解析的JDK源码为ope ...
- Java中的CAS(compare and swap)
定义: 拿着寄存器/某个内存 中的值和另外一个内存的值进行比较,如果值相同了,就把两者交换 boolean CAS(address, expectValue, swapValue){if(&a ...
- 常见锁策略_CAS(Compare And Swap)_synchronized优化
目录 1.常见锁策略 1.1乐观锁vs悲观锁 1.2轻量级锁vs重量级锁 1.3自旋锁vs挂起等待锁 自旋锁 挂起等待锁 1.4互斥锁vs读写锁 1.5公平锁vs非公平锁 公平锁 非公平锁 1.6可重 ...
- Java中CAS(Compare And Swap,比较和交换)算法的技术原理简述
- title: Java中CAS(Compare And Swap,比较和交换)算法的技术原理简述 - date: 2021/8/14 文章目录 CAS全称 Compare And Swap,是一种 ...
- 多线程编程: Compare And Swap (CAS)
CAS介绍 比较并交换(compare and swap, CAS),是原子操作的一种,可用于在多线程编程中实现不被打断的数据交换操作,从而避免多线程同时改写某一数据时由于执行顺序不确定性以及中断的不 ...
- 【CAS】Implementing generic double-word compare and swap for x86/x86-64
Written by Marwan Burelle 2013-02-27 10:10:00 目录 The ABA problem Double-word CAS Using cmpxchg for 3 ...
- CAS:compare and swap
基于项目:https://github.com/Rtoax/OpenCRTL 要问最小临界区是多少,请看下文 #ifndef __RT_ASM_LOCK_CAS_H #define __RT_ASM_ ...
- java cas机制_java并发编程中的CAS机制,你理解嘛?
学习Java并发编程,CAS机制都是一个不得不掌握的知识点.这篇文章主要是从出现的原因再到原理进行一个解析.希望对你有所帮助. 一.为什么需要CAS机制? 为什么需要CAS机制呢?我们先从一个错误现象 ...
最新文章
- 使用ADO.NET 的最佳实践(zz)
- Android 获取keystore SHA1方法
- 经典永驻,重温设计模式 |硬核!
- (~解题报告~)L1-020 帅到没朋友 (20分)——25行代码AC
- 创建vue项目(三)路由跳转、反向代理、本地存储、状态管理
- Cloud Toolkit 部署应用到 EDAS Kubernetes 集群
- 程序员到底要不要重复造轮子?
- MySQL 8.0开始Group by不再排序
- bash资源监控_10个资源成为更好的Bash用户
- yii2搭建完美后台并实现rbac权限控制实例教程
- Base64编码对照表
- input[type=radio]自定义样式
- 阿里巴巴Java开发文档2020版学习-OOP 规约
- Oracle分页查询
- 亚马逊API接口大全
- 2020FME博客大赛——基于FME利用高德路径规划AP实现公共服务设施可达性分析——以厦门山海健康步道为例
- c#线程-线程间发消息-线程给窗体传值
- python,你也和小猪佩奇一样社会了!
- VNPY策略加密教程
- postgresql 官网学习文档
热门文章
- 4.闭锁 CountDownLatch
- OpenDaylight风头正劲,华三通信在其中大显身手
- Salt: 2015.8.8.2 L@匹配BUG
- Python学习笔记—Dict和set
- 8款功能强大的最新HTML5特效实例
- numpy.empty
- Python 正则表达式模块 - re
- 从 0 开始了解 Docker(ubuntu )
- 小程序学习笔记三:页面文件详解之视图层WXML、WXS、WXSS文件
- 《深入理解Android:卷III A》一一2.2Java层中的Binder分析