最通俗易懂的乐观锁与悲观锁原理及实现

转载自  最通俗易懂的乐观锁与悲观锁原理及实现

一、乐观锁

 总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS操作实现。

 version方式:一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。

核心SQL代码:

update table set x=x+1, version=version+1 where id=#{id} and version=#{version};  

 

 CAS操作方式:即compare and swap 或者 compare and set,涉及到三个操作数,数据所在的内存值,预期值,新值。当需要更新时,判断当前内存值与之前取到的值是否相等,若相等,则用新值更新,若失败则重试,一般情况下是一个自旋操作,即不断的重试。

一、悲观锁

 总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加锁(读锁、写锁、行锁等),当其他线程想要访问数据时,都需要阻塞挂起。可以依靠数据库实现,如行锁、读锁和写锁等,都是在操作之前加锁,在Java中,synchronized的思想也是悲观锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql update field_mysql-更新表与另一个选择,但字段是SUM(someField)

基本上我有这样的事情:UPDATETableSETTable.col1 other_table.col1,FROMTableINNER JOINother_tableONTable.id other_table.id问题是我想用如下选择来更新col1:SELECT SUM(col1) FROM other_table WHERE Table.id other_table.id AND period > 20…

分布式一致性算法:Raft 算法

由于微信字数的限制,此处给出的并非全文,请拉到页面最下方点击阅读原文查看完整版。 Raft 算法是可以用来替代 Paxos 算法的分布式一致性算法,而且 raft 算法比 Paxos 算法更易懂且更容易实现。本文对 raft 论文进行翻译,希望能有…

聚集索引、辅助索引、覆盖索引、联合索引

转载自 聚集索引、辅助索引、覆盖索引、联合索引 聚集索引(Clustered Index) 聚集索引就是按照每张表的主键构造一棵B树,同时叶子节点中存放的即为整张表的行记录数据。 举个例子,直观感受下聚集索引。 创建表t,…

2019蓝桥杯省赛---java---B---6(特别数的和)

题目描述 时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分【问题描述】小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他…

java谓词_在Java中谓词

我假设你正在谈论来自Guava的com.google.common.base.Predicate 。从API:确定给定input的true值或false值。 例如,一个RegexPredicate可能实现了Predicate ,并且对任何匹配给定正则expression式的string返回true。这本质上是一个booleantesti…

.NET Core项目部署到linux(Centos7)

1.开篇说明 a 上篇博客简单的说明了一下 使用.NET Core开发的一个总结(.NET Core跨平台:使用.NET Core开发一个初心源商城总括),那么这篇博客我们就在上一篇博客的基础上对其代码进行部署,将其部署在Linux Centos7下。 b 这周周二…

2020蓝桥杯省赛---java---B---1(指数计算)

题目描述 代码实现 解法一 计算器 解法二 package com.atguigu.lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner input new Scanner(System.in);int a1,b1921,c7;for (int i 0; i < 2020; i) {aa*7;if(a>1…

java安装显示更改_java 安装与配置

到java.sun.com下载自解压安装包jdk-1_5_0_06-nb-4_1-linux-ml.bin安装&#xff1a;[rootRHEL4 JDK-1.5.0.06]# chmod x jdk-1_5_0_06-nb-4_1-linux-ml.bin[rootRHEL4 JDK-1.5.0.06]# ./jdk-1_5_0_06-nb-4_1-linux-ml.bin选择安装位置&#xff0c;NetBeans安装目录&#xff1a;…

dayjs​​​​​​​文档

转载自 dayjs API Dayjs 并没有改变或覆盖 Javascript 原生的 Date.prototype&#xff0c; 而是创造了一个全新的包含 Javascript Date 对象的 Dayjs的对象。 Dayjs 对象是不可变的, 所有的 API 操作都将返回一个新的 Dayjs 对象。 解析 当前时间时间字符串Unix 时间戳 (…

ASP.NET Core 优雅的在开发环境保存机密(User Secrets)

前言 在应用程序开发的过程中&#xff0c;有的时候需要在代码中保存一些机密的信息&#xff0c;比如加密密钥&#xff0c;字符串&#xff0c;或者是用户名密码等。通常的做法是保存到一个配置文件中&#xff0c;在以前我们会把他保存到web.config中&#xff0c;但是在ASP.NET C…

震惊,中国历朝历代疆域变迁视频【高清】

中国历代疆域指的是从古至今中国领土变化过程的历史&#xff0c;期间经过数千年的发展历程。 中国疆域自远古以来不断演进变化&#xff0c;从《尚书禹贡》九州开始直到唐朝极盛时疆域:被认为是中国疆域原型。至元朝时不仅统一中国&#xff0c;西藏地方从此正式纳入中国中央政府…

2020蓝桥杯省赛---java---B---2(指数计算)

题目描述 【问题描述】 小明设计了一种文章加密的方法&#xff1a;对于每个字母 c&#xff0c;将它变成某个另外的字符 Tc。下表给出了字符变换的规则&#xff1a; 例如&#xff0c;将字符串 YeRi 加密可得字符串 EaFn。 小明有一个随机的字符串&#xff0c;加密后为 EaF…

java项目新东方在线源码_[VIP源码]【S019】SSM框架开发智夫子在线考试系统项目源码 百度云盘...

java源码项目名称&#xff1a;SSM框架开发智夫子在线考试系统项目源码ssm项目源码5 y& C [0 w! J% F1 n8 z J百度网盘下载链接&#xff1a;4 B i* }. G4 }8 |7 l% G8 游客&#xff0c;如果您要查看本帖隐藏内容请->>回复[/hide]_* r Q0 _! W1 K4 Q" U6 F密码: …

关于Dapper.NET的相关论述

年少时&#xff0c;为何不为自己的梦想去拼搏一次呢&#xff1f;纵使头破血流&#xff0c;也不悔有那年少轻狂。感慨很多&#xff0c;最近事情也很多&#xff0c;博客也很少更新了&#xff0c;毕竟每个人都需要为自己的生活去努力。 最近在一个群里遇到一个人说的话&#xff0c…

81. 搜索旋转排序数组 II---Leecode----java

思路分析 旋转前后&#xff0c;数组中的值总是不变&#xff0c;可以直接进行比较。 代码实现 class Solution {public boolean search(int[] nums, int target) {for(int i0;i<nums.length;i){if(nums[i]target){return true;}}return false;} }

数年之前的寒假

版权声明&#xff1a;文章可以随便转载&#xff0c;但是转载时带上原文地址来源&#xff0c;侵权必究 https://blog.csdn.net/qq_34137397/article/details/54882702对于上学的孩子来说每年都有寒假&#xff0c;可是一样的寒假总是不一样的玩法。自从高中毕业之后&#xff0c;很…

js object 常用方法总结

转载自 js object 常用方法总结 Object.assign(target,source1,source2,...) 该方法主要用于对象的合并&#xff0c;将源对象source的所有可枚举属性合并到目标对象target上,此方法只拷贝源对象的自身属性&#xff0c;不拷贝继承的属性。 Object.assign方法实行的是浅拷贝&…

发布 ASP.NET Core 应用

第一步&#xff1a;运行 dotnet restore 命令&#xff0c;以还原项目中指定的依赖项 1 dotnet restore 第二步&#xff1a;使用 dotnet build 命令为目标平台上的应用创建调试版本。 如果不指定想要生成的运行时标识符&#xff0c;则 dotnet build 命令将会创建仅适用于当前系统…

继承类对方法的影响java_4-Java面向对象-继承(上)

什么是继承?继承有哪些特点?我们在Java中如何实现继承?程序中的继承(面向对象编程思想来源于生活):解决重复代码的出现问题。抽取共性生成父类。此时猫和狗直接继承父类将可以直接使用父类的这些成员属性和方法。此时子类当中的方法就可以只写子类所特有的东西。特点: 1. 利…

javaSE基础代码案例

package org.test; import java.util.Arrays; import java.util.Scanner;/*** * 项目名称&#xff1a;Test * 类名称&#xff1a;TestMain * 类描述&#xff1a; * 创建人&#xff1a;Mu Xiongxiong * 创建时间&#xff1a;2018-3-29 下午3:49:00 * 修改人&…