当前位置: 首页 > news >正文

面试经常被问悲观锁和乐观锁?什么是cas?来我花3分钟时间告诉你

大家都知道吧,多线程访问资源会存在竞争,那么就需要加锁进而让多个线程一个一个访问。

比如有一个房间,一次只能进一个人,现在有十个人都想进去怎么办?

对,加锁。拿一把钥匙,谁抢到钥匙谁就进去,出来后再把钥匙给到剩余的人来竞争

悲观锁:顾名思义,我比较悲观,认为每次访问都会发生竞争,所以需要加锁来保证不会发生竞争。

就像上面10个人总是一起进这个房间。

乐观锁:顾名思义,我很乐观,认为多个线程不会发生竞争,所以就不需要加锁。

就像上面10个人分别在1点到10点来,在房间只呆3分钟就走了,那么就没必要加锁。

那么这个是否会发生竞争,如果鉴别呢? 下面CAS登场了

cas = compare and swap,比较然后再交换。cas 是一个乐观锁

cas涉及到三个变量

  1. v 要修改的变量,是全局的
  2. e 期望修改前变量的值
  3. n 期望修改后的值

比如线程A要对变量V进行修改,首先执行e = get(v),获取变量当前的值,然后执行cas(v,e,n) 这个原子操作。此操作会比较v=e是否成立,如果成立表明没有发生竞争,可以修改变量,如果不成立表明v被修改了,发生了冲突,所以会停止修改。

我们知道e ≠ v 很明显是v被其他线程修改了,发生了竞争。 那么e = v就表明没发生竞争么?

答案显然不是,如果另一个线程将v++ 然后又v— 是不是e = v仍然成立?这个被称作ABA问题

怎么办? 可以对每个变量v附带加上一个时间戳,每次比较时除了比较e = v 再加上一个 etimestamp = vtimestamp即可

当然也有别的版本是新增一个version, 每次修改version++, 然后比较vversion = eversion即可

完整流程如下:

 

http://www.lryc.cn/news/14143.html

相关文章:

  • React源码分析3-render阶段(穿插scheduler和reconciler)
  • 3功能测试心得分享
  • Python-推导式
  • 操作系统线程
  • vue3中如何定义响应式变量
  • 【C++修炼之路】20.手撕红黑树
  • 树状数组(高级数据结构)-蓝桥杯
  • Flink-多流转换(Union、Connect、Join)
  • kubeadmin安装k8s集群
  • java3月train笔记
  • Apollo Config原理浅析
  • Kubernetes二 Kubernetes之实战以及pod详解
  • 机械革命黑苹果改造计划第四番-外接显示器、win时间不正确问题解决
  • Linux docker(03)可使用GPU渲染的x11docker实战总结
  • 【Linux操作系统】【综合实验一 Linux操作基础】
  • 关于监控服务器指标、CPU、内存、警报的一些解决方案
  • vue3全家桶技术栈基础(一)
  • 群晖-第2章-设置HTTPS访问
  • 005 利用fidder抓取app的api,获得股票数据
  • 京东测试进阶之路:初入测试碎碎念篇
  • 华为OD机试 - 乘积最大值(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
  • Java并发知识点
  • 前端 ES6 环境下 require 动态引入图片以及问题
  • PCL 欧氏聚类分割
  • 一台服务器最大能支持多少条TCP连接
  • Teradata退出中国,您可以相信中国数据库!
  • markdown组合数学公式
  • Golang实践录:一个字符串比较示例
  • Linux后台开发工具箱-葵花宝典
  • http的请求上下文