锁的分类

在谈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算法相关推荐

  1. JAVA中的CAS算法

    java 中的线程之间的栈空间是相互独立,堆空间是共享的 V:内存值就是主内存中i值 A:预估值(期望值)就是子线程拿到主内存的值(读取到高速缓存中的值) B:更新值是子线程拿到i值后,修改i的值 假 ...

  2. java基础----数据结构与算法----Java API:集合 以及 排序相关API

    概述: 基本数据结构与算法在jdk中都有相应的API 数组+java.util.Arrays java中的集合类 Collection-->List+Set-->接口的实现类 Map   ...

  3. 抖音mysql_抖音四面,复盘总结48题:Java基础+Spring+多线程+算法+MySQL+分布式

    Java岗面试的重点: 数据结构与算法,JVM内存结构.垃圾回收器.回收算法.GC.并发编程相关(多线程.线程池等).NIO/BIO.性能优化.设计模式.Spring框架:分布式相关:Redis缓存. ...

  4. java基础之经典算法总结篇

    1.题目: 判断101-200之间有多少个素数,并输出所有素数. 程序分析: 判断素数的方法为用一个数分别去除以2到sqrt(这个数),如果能够被整除,则表明次数不是素数,反之则是素数. public ...

  5. 【面试篇】Java多线程并发-Java中的CAS机制算法

    Java中的CAS机制算法 a.CAS例子 再讲解CAS机制之前,先来看一道经典的并发执行1000次递增的问题: public class Test { public static int count ...

  6. java 基础算法教程ppt,基础排序算法(附加java实现)

    七种最基本的排序算法:(面试必会!) 冒泡排序: 最基础的排序算法,从数列最前端开始,两两比较,如果前一个数比后一个数大,那么两个数就交换位置,经过一轮遍历之后,最大的数就到了数列的最后一个位置上,再 ...

  7. Java基础:JVM垃圾回收算法

    众所周知,Java的垃圾回收是不需要程序员去手动操控的,而是由JVM去完成.本文介绍JVM进行垃圾回收的各种算法. 1. 如何确定某个对象是垃圾 1.1. 引用计数法 1.2. 可达性分析 2. 典型 ...

  8. Java基础复习-八大基本数据类型-内存模型-基本算法-网络编程

    Java基础 数据类型: 基本数据类型: 整数型:byte short int long(数值型) 浮点型: float double(数值型) 字符型:char 布尔型:boolean 引用数据类型 ...

  9. java cas原理_Java并发之原子变量及CAS算法-上篇

    Java并发之原子变量及CAS算法-上篇 编辑 ​ 概述 本文主要讲在Java并发编程的时候,如果保证变量的原子性,在JDK提供的类中是怎么保证变量原子性的呢?.对应Java中的包是:java.uti ...

  10. Java基础篇(03):流程控制语句,和算法应用

    本文源码:GitHub·点这里 || GitEE·点这里 一.分支语句 流程控制语句对任何一门编程语言都是非常重要的,Java中基于流程控制程序执行的不同步骤和代码块. 1.IF条件 IF条件语句会根 ...

最新文章

  1. weblogic 12c 一键静默建域、集群、受管,计算机以及添加受管到集群
  2. 【前端开发】HTML入门与实战
  3. Apache Kafka-通过concurrency实现并发消费
  4. 内网网段范围_局域网中多网段的划分
  5. java -PDF添加文本水印与图片水印
  6. php在线读取pdf文件大小_PDF转WORD在线转换器哪家强?
  7. ARM平板电脑移植Linux,iperf ARM移植
  8. confer安装与连接度的计算
  9. 知乎:为什么魂斗罗只有128KB却可以实现那么长的剧情?
  10. 计算机协会未来的发展,计算机协会
  11. B. A and B and Compilation Errors
  12. python函数的及函数的参数的基本使用
  13. php检查某个网站,用php开发一个检测某网站是否在正常运行的小模块
  14. c语言求解二元一次方程,c语言,求解二元一次方程
  15. 搭建Mybatis源码环境
  16. 机器学习及其MATLAB实现——BP神经网络
  17. Halcon的texture_laws算子自我研究
  18. 蓝牙音箱延迟测试软件,“Latency Test”详细操作流程,一款测试TWS耳机延迟的软件...
  19. R语言矩阵操作:根据值找到行号和列号
  20. Unity引擎UI模块知识Tree

热门文章

  1. 深入浅出H桥驱动电路
  2. RSA非对称加密算法详解
  3. Python数据预处理--Gensim构建语料词典
  4. 从零学爬虫:采集房天下二手房信息
  5. Python-Selennium之爬虫实战--链家二手房爬虫项目
  6. java redis 抽奖_GitHub - zenmin/luckdraw: 年会抽奖程序 Java开发 可内定中奖人员 一键导入员工 使用简单...
  7. 木疙瘩动画效果视频学习
  8. 8086 CPU的寄存器结构
  9. svn ankhsvn_AnkhSVN和Monad SVN提供商?
  10. 通过IO口控制STC15F2K60S2系列单片机输出pwm