一、乐观锁VS悲观锁

1)关于悲观锁

总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,Java中synchronized和ReentrantLock以及Read-write locks等就是悲观锁思想的实现。

2)关于乐观锁

总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现,StampedLock就是一种乐观锁

二、CAS
CAS和乐观锁相辅相成
很好理解,比较和交换
英文名compare and swap的缩写,
如果用C语言来表示的时候很简单

int cas(long *addr, long old, long new)
{/* Executes atomically. */if(*addr != old)return 0;*addr = new;return 1;
}

但是这种比较和替换会有ABA问题

三、ABA问题

  1. 进程P1读取了一个数值A。
  2. P1被挂起(时间片耗尽、中断等),进程P2开始执行
  3. P2修改数值A为数值B,然后又修改回A
  4. P1被唤醒,比较后发现数值A没有变化,程序继续执行。

对于P1来说,数值A未发生过改变,但实际上A已经被变化过了,继续使用可能会出现问题

四、ABA问题解决

利用版本号比较可以有效解决ABA问题。
相当于加条件判断
java解决用的是AtomicStampedReference
相当于加了版本戳记

【java】乐观锁和悲观锁、CAS和ABA问题相关推荐

  1. 详解各种锁:CAS、共享锁、排它锁、互斥锁、悲观锁、乐观锁、行级锁、表级锁、页级锁、死锁、JAVA对CAS的支持、ABA问题、AQS原理

    共享锁(S锁) 又称为读锁,可以查看但无法修改和删除的一种数据锁.如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排它锁.获准共享锁的事务只能读数据,不能修改数据. 共享锁下其它用 ...

  2. Java并发 乐观锁和悲观锁 乐观锁的一种实现方式CAS

    为什么80%的码农都做不了架构师?>>>    首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人 ...

  3. Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

    Java并发问题–乐观锁与悲观锁以及乐观锁的一种实现方式-CAS </h1><div class="clear"></div><div c ...

  4. java学习系列2(并发锁问题-乐观锁与悲观锁以及乐观锁的一种实现方式-CAS)

    Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS 首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别 ...

  5. **Java有哪些悲观锁的实现_面试4连问:乐观锁与悲观锁的概念、实现方式、场景、优缺点?...

    推荐阅读: 数据库面试4连问:分库分表,中间件,优缺点,如何拆分? 终极手撕之架构大全:分布式+框架+微服务+性能优化,够不够? 消息队列面试,你能顶得住面试官这波10大连环炮的攻势吗? 01 乐观锁 ...

  6. 悲观锁和乐观锁_乐观锁和悲观锁 以及 乐观锁的一种实现方式-CAS

    悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞知道它拿到锁.传统的关系型数据库里面就用到了很多的这种锁机制,比如行锁,表锁等 ...

  7. 乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

    首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁.传统的关系型数据库里边就用到了很 ...

  8. Java并发篇_乐观锁与悲观锁

    乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展. 一.引入概念 1.悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次 ...

  9. Java多线程学习总结(5)——乐观锁和悲观锁的基本概念、实现方式(含实例)、适用场景及常见面试题

     分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!点击浏览教程 一.基本概念 乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题. 乐观锁 ...

最新文章

  1. 《使用云计算和大数据进行性能测试》
  2. 【传智播客】Javaweb程序设计任务教程 黑马程序员 课后答案【合集】
  3. java 匿名接口实现_Java通过接口实现匿名类的实例代码
  4. DB-Engines:Snowflake荣获2021年的年度DBMS
  5. 机器学习之熵【从定义到代码】
  6. 机器学习-吴恩达-笔记-13-大规模机器学习
  7. 计算机系统-电路设计07-上升沿D触发器的内部电路实现/移位寄存器/串行接口/并行接口
  8. 使用JQuery做一组复选框的功能。
  9. 【日常点滴015】python中学完pandas后的代码练习 附源数据文件
  10. 43. Pandas查询数据的简便方法df.query
  11. Win11打印机脱机了怎么重新连接?Win11打印机脱机的解决方法
  12. 泰坦尼克号python数据预处理_Python机器学习入门:泰坦尼克号预测
  13. 基于视觉的机器人抓取: 论文及代码(Vision-based Robotic Grasping: Papers and Codes)
  14. 基于java的点餐微信小程序
  15. Telegraf 简单使用介绍
  16. Spring框架介绍——第一章
  17. GDAL python教程基础篇(6)OGR空间滤波器
  18. Linux系统的应用
  19. 百度地图搜索提示层级覆盖问题
  20. 有如图所示的七巧板,试设计算法,使用至多4种不同颜色对七巧板进行涂色(每块七巧板一种颜色),要求相邻区域的颜色互补相同,打印输出所有可能的涂色方案。

热门文章

  1. android zxing扫码 生成二维码
  2. 关于绝对定位与相对定位的区别和用法
  3. 【创业经】创业第二步:洞悉本质,才能掌控发展的主动权!
  4. 框架学习笔记 ---- Spring5
  5. 搜狗起诉360,“因爱生恨”引发的恋爱悲剧
  6. realme v3 怎么样
  7. 电商中常见的高并发解决方案
  8. Linux使用tar命令解压文件到指定目录
  9. 飞机选座 --- 一道可用动态规划解决的概率问题
  10. chimee 播放器 在rollup打包器中使用后的各种报错汇总