简单说说悲观锁与乐观锁

简介: 悲观锁与乐观锁

悲观锁,每次访问资源都会加锁,执行完同步代码释放锁,synchronized 和 ReentrantLock 属于悲观锁。

乐观锁,不会锁定资源,所有的线程都能访问并修改同一个资源,如果没有冲突就修改成功并退出,否则就会继续循环尝试。乐观锁最常见的实现就是CAS。

乐观锁一般来说有以下2种方式:

  1. 使用数据版本记录机制实现,这是乐观锁最常用的一种实现方式。给数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的version字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。
  2. 使用时间戳。数据库表增加一个字段,字段类型使用时间戳(timestamp),和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。

适用场景:

  • 悲观锁适合写操作多的场景。
  • 乐观锁适合读操作多的场景,不加锁可以提升读操作的性能。
相关文章
|
7月前
|
SQL 数据处理 数据库
乐观锁和悲观锁
乐观锁和悲观锁
70 0
|
3月前
|
SQL XML Java
乐观锁与悲观锁是什么?
本文详细分析了悲观锁和乐观锁的原理、区别、实现方式及应用场景。悲观锁假设冲突频繁,通过加锁保护数据一致性,适用于高并发冲突场景;乐观锁假设冲突较少,通过版本号或时间戳检测冲突,适用于读多写少场景。文章通过具体示例展示了两种锁机制的实现过程,并总结了其优缺点和适用场景,帮助读者根据实际需求选择合适的并发控制机制。
232 3
|
Java API 数据库
什么是乐观锁,什么是悲观锁?
在互联网公司面试中,很多小伙伴都被问到关于锁的理解。今天,我给小伙伴们来聊一聊我对锁的理解,不管我们互斥锁、自旋锁、重入锁、读写锁、行锁、表锁等等等等这些概念,我把他们都归纳为两种类型,乐观锁和悲观锁。
126 0
|
7月前
|
安全 Java 关系型数据库
乐观锁与悲观锁
【4月更文挑战第11天】乐观锁与悲观锁
49 3
|
7月前
|
关系型数据库 MySQL 数据处理
一文彻底理解乐观锁与悲观锁
一文彻底理解乐观锁与悲观锁
826 0
|
7月前
|
安全 关系型数据库 MySQL
悲观锁和乐观锁
悲观锁和乐观锁
|
XML 前端开发 Java
案例突破——悲观锁和乐观锁
案例突破——悲观锁和乐观锁
151 0
案例突破——悲观锁和乐观锁
|
NoSQL 算法 Java
乐观锁与悲观锁的实现
本文力求来通俗地讲讲编程中的乐观锁和悲观锁,以及分别是怎么实现的。
102 0
乐观锁与悲观锁的实现
|
算法
悲观锁和乐观锁的区别
悲观锁和乐观锁的区别
232 0
|
数据库
乐观锁和悲观锁的底层原理
乐观锁和悲观锁是并发编程中常用的两种锁机制,用于解决多线程或多进程环境下的并发访问问题。它们的底层原理和适用场景有所不同。
154 0