Java基础之CAS算法
锁的分类
在谈CAS之前,我们先来聊聊锁的分类。
从资源的竞争激烈程度的角度来看,可以把锁分为乐观锁和悲观锁。
乐观锁:乐观锁认为这是个冷门资源,不会有人跟我竞争使用资源。对资源的竞争感到乐观。
悲观锁:悲观锁认为这是个热门资源,总有小伙子会跟我抢着使用资源。对资源的竞争感到悲观。
- 悲观锁适合写操作多的场景,先加锁可以保证写操作时数据的正确性。
- 乐观锁适合读操作多的场景,不加锁的特点能够使其读操作的性能大幅提升。
CAS算法
我们再来讲讲CAS算法。CAS,全称Compare And Swap(比较与交换),是著名的乐观锁算法。CAS包含三个属性:
1.数据原值:V
2.数据现在的值:A
3.修改数据的目标值:B
当且仅当V与A相等时,CAS才通过原子操作更新值为B,如果V与A不相等,CAS会进行自旋操作,一直寻求更新,直到更新成功。
CAS算法的问题
1.ABA问题:原值为A,①想将A改成C,在①取出原值,且未修改的时候,②将A改成B,③将B改成A,这时①再执行更新操作,因为这个时候原值依然为A所以①操作是可以直接成功的,从而忽略了中间②③的操作步骤。
针对ABA问题,从JDK 1.5开始新增了AtomicStampedReference类,类中的compareAndSet方法,就是检查当前值内存地址是否与期望值内存地址相等,当前值得时间戳是否与期望值得时间戳相等,如果全部相等,则使用原子操作更新原值。
2.写操作多,则效率变低:在大量并发的情况下,存在大量线程去修改资源,就不可避免的出现大量线程因原值不同被搁置,大量的更新操作被迫自旋,所以写操作多的情况下,不建议使用CAS。
3.只能保证一个变量的原子操作:JDK 1.5之前,CAS只支持单个变量,当操作涉及多个变量时,CAS失效。JDK 1.5提供了AtomicReference类来保障对象更新操作的原子性。
CAS在Java中的应用
1.AtomicInteger等原子类的线程安全
2.JDK1.8中ConcurrentHashMap的线程安全
3.ReenTrantLock中更改锁状态
4.创建对象的内存分配线程安全性
Java基础之CAS算法相关推荐
- JAVA中的CAS算法
java 中的线程之间的栈空间是相互独立,堆空间是共享的 V:内存值就是主内存中i值 A:预估值(期望值)就是子线程拿到主内存的值(读取到高速缓存中的值) B:更新值是子线程拿到i值后,修改i的值 假 ...
- java基础----数据结构与算法----Java API:集合 以及 排序相关API
概述: 基本数据结构与算法在jdk中都有相应的API 数组+java.util.Arrays java中的集合类 Collection-->List+Set-->接口的实现类 Map ...
- 抖音mysql_抖音四面,复盘总结48题:Java基础+Spring+多线程+算法+MySQL+分布式
Java岗面试的重点: 数据结构与算法,JVM内存结构.垃圾回收器.回收算法.GC.并发编程相关(多线程.线程池等).NIO/BIO.性能优化.设计模式.Spring框架:分布式相关:Redis缓存. ...
- java基础之经典算法总结篇
1.题目: 判断101-200之间有多少个素数,并输出所有素数. 程序分析: 判断素数的方法为用一个数分别去除以2到sqrt(这个数),如果能够被整除,则表明次数不是素数,反之则是素数. public ...
- 【面试篇】Java多线程并发-Java中的CAS机制算法
Java中的CAS机制算法 a.CAS例子 再讲解CAS机制之前,先来看一道经典的并发执行1000次递增的问题: public class Test { public static int count ...
- java 基础算法教程ppt,基础排序算法(附加java实现)
七种最基本的排序算法:(面试必会!) 冒泡排序: 最基础的排序算法,从数列最前端开始,两两比较,如果前一个数比后一个数大,那么两个数就交换位置,经过一轮遍历之后,最大的数就到了数列的最后一个位置上,再 ...
- Java基础:JVM垃圾回收算法
众所周知,Java的垃圾回收是不需要程序员去手动操控的,而是由JVM去完成.本文介绍JVM进行垃圾回收的各种算法. 1. 如何确定某个对象是垃圾 1.1. 引用计数法 1.2. 可达性分析 2. 典型 ...
- Java基础复习-八大基本数据类型-内存模型-基本算法-网络编程
Java基础 数据类型: 基本数据类型: 整数型:byte short int long(数值型) 浮点型: float double(数值型) 字符型:char 布尔型:boolean 引用数据类型 ...
- java cas原理_Java并发之原子变量及CAS算法-上篇
Java并发之原子变量及CAS算法-上篇 编辑 概述 本文主要讲在Java并发编程的时候,如果保证变量的原子性,在JDK提供的类中是怎么保证变量原子性的呢?.对应Java中的包是:java.uti ...
- Java基础篇(03):流程控制语句,和算法应用
本文源码:GitHub·点这里 || GitEE·点这里 一.分支语句 流程控制语句对任何一门编程语言都是非常重要的,Java中基于流程控制程序执行的不同步骤和代码块. 1.IF条件 IF条件语句会根 ...
最新文章
- weblogic 12c 一键静默建域、集群、受管,计算机以及添加受管到集群
- 【前端开发】HTML入门与实战
- Apache Kafka-通过concurrency实现并发消费
- 内网网段范围_局域网中多网段的划分
- java -PDF添加文本水印与图片水印
- php在线读取pdf文件大小_PDF转WORD在线转换器哪家强?
- ARM平板电脑移植Linux,iperf ARM移植
- confer安装与连接度的计算
- 知乎:为什么魂斗罗只有128KB却可以实现那么长的剧情?
- 计算机协会未来的发展,计算机协会
- B. A and B and Compilation Errors
- python函数的及函数的参数的基本使用
- php检查某个网站,用php开发一个检测某网站是否在正常运行的小模块
- c语言求解二元一次方程,c语言,求解二元一次方程
- 搭建Mybatis源码环境
- 机器学习及其MATLAB实现——BP神经网络
- Halcon的texture_laws算子自我研究
- 蓝牙音箱延迟测试软件,“Latency Test”详细操作流程,一款测试TWS耳机延迟的软件...
- R语言矩阵操作:根据值找到行号和列号
- Unity引擎UI模块知识Tree
热门文章
- 深入浅出H桥驱动电路
- RSA非对称加密算法详解
- Python数据预处理--Gensim构建语料词典
- 从零学爬虫:采集房天下二手房信息
- Python-Selennium之爬虫实战--链家二手房爬虫项目
- java redis 抽奖_GitHub - zenmin/luckdraw: 年会抽奖程序 Java开发 可内定中奖人员 一键导入员工 使用简单...
- 木疙瘩动画效果视频学习
- 8086 CPU的寄存器结构
- svn ankhsvn_AnkhSVN和Monad SVN提供商?
- 通过IO口控制STC15F2K60S2系列单片机输出pwm