悲观锁 乐观锁的原理及应用场景
目录
1. 悲观锁
应用场景:多写场景,线程安全
2. 乐观锁
应用场景:多读场景,提高吞吐量
悲观锁和乐观锁其实核心就一个是否支持多线程并发的问题。
1. 悲观锁
顾名思义就是很悲观,每次拿数据都会认为别的线程会修改该数据,所以会给数据上锁;
这样抢到锁的线程运行,取到数据做操作,
这期间其他线程想要访问该数据时,都是阻塞block挂起状态,操作不了;
核心就是不支持多并发,是单线程操作,通过抢占时间片的方式来抢锁的使用权,把并发变成了串行。
共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。
应用场景:
悲观锁适用于多写的场景,保证线程安全和数据安全
mysql的行锁、表锁、读锁、写锁;
java中的synchronized。
2. 乐观锁
顾名思义就是很乐观,每次拿数据都认为别的线程不会修改数据,因此不会给数据上锁;
但会在数据更新时判断一下,在此期间其他线程有没有对该数据做更新,最终通过多个线程的逐一更新获取数据的最终值;
判断单一线程操作数据期间,其他线程有没有对该数据做修改用的是,version版本号机制、CAS算法。
乐观锁支持多线程并发,每个线程在不同的时间节点对数据做更新操作,每次更新时候都会判断其他线程是否对数据做了更新。
(1)version版本号机制
一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。
当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。
sql源码:
update table set x=x+1, version=version+1 where id=#{id} and version=#{version};
(2)CAS算法机制
即compare and swap 或者 compare and set,涉及到三个操作数,数据所在的内存值,预期值,新值。当需要更新时,判断当前内存值与之前取到的值是否相等,若相等,则用新值更新,若失败则重试,一般情况下是一个自旋操作,即不断的重试。
应用场景:
乐观锁适用于多读的场景,获取数据不再创建、销毁锁,减少了锁的开销,加大了数据的吞吐量,
Redis等非关系型数据库
ps:Redis是单线程操作,把事务封闭在单一线程中,避免了线程的安全问题,所以里面没有加悲观锁;
不过对于依赖多个Redis操作的复合操作来说,还是需要加锁的,而且有可能是分布式锁,也可以用LUA脚本,用任务队列的方式解决多任务并发的问题。
悲观锁 乐观锁的原理及应用场景相关推荐
- Java锁详解:“独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁+线程锁”
在Java并发场景中,会涉及到各种各样的锁如公平锁,乐观锁,悲观锁等等,这篇文章介绍各种锁的分类: 公平锁/非公平锁 可重入锁 独享锁/共享锁 乐观锁/悲观锁 分段锁 自旋锁 线程锁 乐观锁 VS 悲 ...
- 最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁
在Java并发场景中,会涉及到各种各样的锁,比如:高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景,这些锁有对应的种类:公平锁,乐观锁,悲观锁等等,这篇文章来详细介绍各种锁的分类: 公 ...
- 理解悲观锁乐观锁、同步锁、读锁、写锁
ava 锁分类 Java 中的锁有很多,可以按照不同的功能.种类进行分类,下面是我对 Java 中一些常用锁的分类,包括一些基本的概述 从线程是否需要对资源加锁可以分为 悲观锁 和 乐观锁 从资源已被 ...
- mysql悲观群_谈谈mysql的悲观和乐观锁
悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.之前有写过一篇文章关于并发的处理思路和解决方案,这里我单独将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍一 ...
- java 对变量加锁_Java最全锁剖析:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁...
乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度,在Java和数据库中都有此概念对应的实际应用. 1.乐观锁 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会 ...
- 【Java 并发编程】线程锁机制 ( 悲观锁 | 乐观锁 | CAS 三大问题 | ABA 问题 | 循环时间长问题 | 多个共享变量原子性问题 )
文章目录 一.悲观锁 二.乐观锁 三.乐观锁 CAS 三大问题 一.悲观锁 假设有 222 个线程 , 线程 A 和 线程 B ; 线程 A 访问共享资源 , 线程 B 等待 , 一旦线程 A 访问结 ...
- Hibernate悲观锁/乐观锁
如果需要保证数据访问的排它性,则需对目标数据加"锁",使其无法被其它程序修改 一,悲观锁 对数据被外界(包括本系统当前的其它事务和来自外部系统的事务处理)修改持保守态度,通过数据库 ...
- innodb 悲观锁 乐观锁_mysql乐观锁、悲观锁、共享锁、排它锁、行锁、表锁
mysql乐观锁.悲观锁.共享锁.排它锁.行锁.表锁 乐观锁 总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使 ...
- MySQL - 行锁 表锁 乐观锁 悲观锁 读锁 写锁
MySQL - 行锁 表锁 乐观锁 悲观锁 读锁 写锁 锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足.在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(I ...
最新文章
- vue自定义组件 → 场馆预约の小时范围控件【手到擒来】
- [Vue warn]: Failed to mount component: template or render function not defined. 错误解决方法
- 微信文件撤回时间多长_微信悄悄上线新玩法:拍了拍、朋友圈可重新编辑
- 网卡 远程唤醒问题故障排除
- gridview不换行,高亮显示
- 关于DSP2812控制W5500的程序解读
- matlab 堆图,堆积条形图Matlab
- 太阳能发电板的规格尺寸_太阳能电池板瓦数和尺寸如何计算?
- 【论文翻译】 Residual Networks Behave Like Ensembles of Relatively Shallow Networks
- 一维数组(简单摇骰子小游戏)
- 机器学习公开课笔记第一周
- JQ input value取值再赋值
- C++课程设计 通讯录管理系统 原码及解析
- 20220323有道云笔记如何收藏文章和剪报功能
- web安全[网易白帽子课程笔记+体会]-02web安全基础
- e生保等待期什么意思_平安e生保,关于等待期出险的详细解说
- 个人微信/支付宝免签系统/收款自动监听,自动发货
- 管理信息系统(大一C语言课程设计)
- 龙应台《给河马刷牙》
- CentOS7无盘系统:nfs4_reclaim_open_state: Lock reclaim failed!