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

基本锁介绍

1、分类

乐观锁:在select的时候不会加锁,是基于程序实现的,所以不会存在死锁的情况。适用于读多写少的场景(写的并发量相对不高),可以提高系统的吞吐量。因为如果写多的话,乐观锁会有很大机率更新失败,需要不断的自旋执行查找和更新操作。自旋的时候会一直占用CPU,会耗费大量的CPU资源。悲观锁:在select的时候就会加锁,采用先加锁后处理的模式,虽然保证了数据处理的安全性,但也会阻塞其他线程的写操作。悲观锁适用于写多读少的场景,因为拿不到锁的线程,会将线程挂起,交出CPU资源,可以把CPU给其他线程使用,提高了CPU的利用率。锁分类:悲观锁:具有强烈的独占和排他特性,在整个数据处理过程中,将数据处于锁定状态。适合于写比较多,会阻塞读操作。乐观锁:采取了更加宽松的加锁机制,大多是基于数据版本( Version )及时间戳来实现。。适合于读比较多,不会阻塞读独占锁:互斥锁、排他锁:保证在任一时刻,只能被一个线程独占排他持有。synchronized、ReentrantLock
共享锁:可同时被多个线程共享持有。CountDownLatch到计数器、Semaphore信号量 可重入锁:又名递归锁。同一个线程在外层方法获取锁的时候,在进入内层方法时会自动获取锁。
不可重入锁:公平锁: 有优先级的锁,先来先得,谁先申请锁就先获取到锁
非公平锁: 无优先级的锁,后来者也有机会先获取到锁自旋锁: 当线程尝试获取锁失败时(锁已经被其它线程占用了),无限循环重试尝试获取锁
阻塞锁: 当线程尝试获取锁失败时,线程进入阻塞状态,直到接收信号后被唤醒。在竞争激烈情况下,性能较高读锁: 共享锁
写锁: 独占排他锁偏向锁:一直被一个线程所访问,那么该线程会自动获取锁
轻量级锁:CAS):当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。
重量级锁:当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候(10次),还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁。重量级锁会让他申请的线程进入阻塞,性能降低。
以上其实是synchronized的锁升级过程表级锁: 对整张表加锁,加锁快开销小,不会出现死锁,但并发度低,会增加锁冲突的概率
行级锁: 是mysql粒度最小的锁,只针对操作行,可大大减少锁冲突概率,并发度高,但加锁慢,开销大,会出现死锁

2、具体锁实现:

1、jvm:

ReentrantLock悲观的独占的可重入的可公平可不公平锁synchronized悲观的独占的可重入的非公平锁无锁 --> 偏向锁(同一个线程再次获取锁) --> 轻量级锁(自旋) --> 重量级锁

2、mysql:

select ... for update:悲观的独占的
select ... lock in share mode

3、jvm:ReentrantLock + synchronized

	1.单个jvm实例 单机2.必须单例3.与事务并存问题总之,不适合于保证数据库数据可靠性

4、mysql:

	1.直接更新时判断。在更新中判断库存是否大于0 update table set surplus = (surplus - buyQuantity) where id = 1 and (surplus - buyQuantity) > 0 ;解决jvm锁多例模式锁失效问题 及 事务共存问题锁范围控制:条件字段必须创建索引;查询条件必须具体的值同一个商品有多个库存时,无法解决。无法记录库存变化前后的状态2.悲观锁:select ... for update库存操作要统一:不能有的操作是select ... for update 而有的操作是普通的select死锁风险:多条记录时,加锁顺序要一致阻塞及性能问题3.乐观锁:version 或者 时间戳(CAS思想)ABA问题失败需要重试,高并发情况下性能不高读写分离情况下导致乐观锁不可靠

5、zookeeper

客户端:ZooKeeper原生客户端、ZkClient、Curator前两个客户端参照:https://blog.csdn.net/qq_42349306/article/details/118209298
读操作和设置监听事件之间是有原子性的阻塞公平锁:1.接收到请求时,在/locks节点下创建一个临时序列化节点2.判断自己是不是/locks节点下最下的节点:是则获取到锁,不是则监听前一个节点3.获取到锁,处理完业务逻辑后,通过delete删除当前节点释放锁。监听当前节点的下一个节点收到通知,重复第二步。

Curator分布式锁源码解读:https://blog.csdn.net/qq_41432730/article/details/123389670

相关文章:

  • Multi-Modal Multi-Stream UNET Model for Liver Segmentation
  • HTML5 的离线储存怎么使用,工作原理
  • Vue网页中使用PDF.js弹窗显示pdf文档所有内容
  • Spark---转换算子、行动算子、持久化算子
  • 【C语言】函数(四):函数递归与迭代,二者有什么区别
  • django restful framework序列化与反序列化
  • 二十三、RestClient操作索引库
  • EPT-Net:用于3D医学图像分割的边缘感知转换器
  • gitlab图形化界面使用
  • Verilog基础:时序调度中的竞争(一)
  • ElasticSearch之cat aliases API
  • Redis中文结果查看方式
  • 【Python 千题 —— 基础篇】删除列表值
  • Nginx模块开发之http过滤器filter
  • MySQL面试,MySQL事务,MySQL锁,MySQL集群,主从,MySQL分区,分表,InnoDB
  • CSS魔法堂:Absolute Positioning就这个样
  • ES学习笔记(12)--Symbol
  • JavaScript 奇技淫巧
  • Java程序员幽默爆笑锦集
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • QQ浏览器x5内核的兼容性问题
  • 大主子表关联的性能优化方法
  • 多线程 start 和 run 方法到底有什么区别?
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 机器学习学习笔记一
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 小程序开发中的那些坑
  • 移动端唤起键盘时取消position:fixed定位
  • ionic异常记录
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • ![CDATA[ ]] 是什么东东
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (2)STM32单片机上位机
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (4)事件处理——(7)简单事件(Simple events)
  • (二十三)Flask之高频面试点
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转) Android中ViewStub组件使用
  • (转)ABI是什么
  • (转)创业家杂志:UCWEB天使第一步
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .Net Core 中间件与过滤器
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .net 调用php,php 调用.net com组件 --
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .net开发时的诡异问题,button的onclick事件无效
  • .NET框架设计—常被忽视的C#设计技巧
  • .net连接MySQL的方法
  • .net实现客户区延伸至至非客户区