简述乐观锁和悲观锁——Java

悲观锁和乐观锁

悲观就是任何事都认为会往坏处发生,乐观就是认为任何事都会往好处发生。

打个比方,假如一个公司里只有一台打印机,如果多个人同时打印文件,可能出现混乱的问题,他的资料打印在了我的资料上,悲观锁就是我认为一定会出问题,所以我在使用打印机的时候直接把打印机霸占了,不允许其他人打印文件。这就是悲观锁。

同样的,我认为即使是多个人一起打印,打印机也不会出现混乱打印的情况,所以我不对打印机做出处理,而是确认下每次打印的东西即可。

Java如何实现

悲观锁

悲观锁实现主要靠 synchronized 和 ReentrantLock 给资源加锁,确保资源只分配给一个人,比如我独占打印机。等我打印完了才放开。

synchronized 可以修饰方法体,对象和变量,表示同时只有一个线程能访问。

public void performSynchronisedTask() {synchronized (this) {// 需要同步的操作}
}private Lock lock = new ReentrantLock();
lock.lock();
try {// 需要同步的操作
} finally {lock.unlock();
}

乐观锁

乐观锁可以通过 版本号机制和CAS 算法实现。

版本号机制,可以在数据库添加一个数据版本号,当对数据进行修改时同时修改版本号,比如我对这条数据进行了修改,同时对版本号进行+1,可以表示这条数据被修改了几次。

举个例子,假如线程 A 对数据进行修改,首先先读取数据库的版本号,假设此时为1,然后执行修改操作,此时线程 B 也要对数据库进行修改,获取到版本号也为1,然后线程 A 完成了修改,并将版本号修改为 2。之后线程B完成修改时用获取到的版本号和现在的版本号进行对比,结果不用同,所以线程B 对数据库的修改回滚。

CAS 算法

CAS 算法全称是 Compare And Swap(比较与交换),是一个原子操作,当操作一旦开始就不能被打断。

CAS 主要包含三个操作数:V 要更新的变量值,E 预期值,N 要写入的新值

举个例子。假设线程 A 对数据进行修改,想要将数字 6 修改为2,那么此时获取到 CAS 的三个操作数为:V=6,E=6,N=2。此时线程 B 也想对其进行修改,将 6 改为 4,那么它获取到的三个操作数分别为:V=6,E=6,N=4。线程A 首先完成了对数据的修改,获取新的 V,然后用 E 和 V 进行比较,如果相等,则表示没有被修改,所以可以继续完成修改,将 6 改为 2。之后 线程B 也要对其进行修改,获取到新的 V 是 2,但他的预期值是 6,二者不等,所以认定为被其他线程修改了,所以此次修改失败,可以重试,也可以放弃。

 具体是实现是通过 Atomic 原子类进行操作的,可以去详细看一下。

问题

悲观锁

悲观锁加锁,独占打印机就会导致其他人不能打印资料,如果要打印的人很多,这就会造成阻塞问题。

乐观锁

版本号机制,高并发情况下,会导致版本号频繁变动,需要额外的开销去维护版本号。

CAS ,最常见的问题就是 ABA 问题,即当线程 A 进行修改时,其他的线程将这个元素改成了其他数字又改了回来。解决思路就是在变量前面加上版本号或者时间戳。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【视频讲解】神经网络、Lasso回归、线性回归、随机森林、ARIMA股票价格时间序列预测|附代码数据

全文链接:https://tecdat.cn/?p37019 分析师:Haopeng Li 随着我国股票市场规模的不断扩大、制度的不断完善,它在金融市场中也成为了越来越不可或缺的一部分。 【视频讲解】神经网络、Lasso回归、线性回归、随机森林、ARIMA股票价格时间序列…

Unity动画系统(4)

6.3 动画系统高级1-1_哔哩哔哩_bilibili p333- 声音组件添加 using System.Collections; using System.Collections.Generic; using UnityEngine; public class RobotAnimationController : MonoBehaviour { [Header("平滑过渡时间")] [Range(0,3)] publ…

AI智能名片S2B2C商城小程序在社群去中心化管理中的应用与价值深度探索

摘要:随着互联网技术的飞速发展,社群经济作为一种新兴的商业模式,正逐渐成为企业与用户之间建立深度连接、促进商业增长的重要途径。本文深入探讨了AI智能名片S2B2C商城小程序在社群去中心化管理中的应用,通过详细分析社群去中心化…

科普文:多线程如何使用CPU缓存?

一、前言 计算机的基础知识聊的比较少,但想要更好的理解多线程以及为后续多线程的介绍做铺垫,所以有必要单独开一篇来聊一下 CPU cache。 二、CPU 前面有一篇文章关于 CPU是如何进行计算 感兴趣的同学,可以先移步了解一下,不了…

连接Redis异常:JedisMovedDataException

redis.clients.jedis.exceptions.JedisMovedDataException: MOVED 5798 192.168.187.138:6379 在使用JAVA API连接redis的时候,出现了异常: 问题的原因 JAVA API实现是redis集群实现方式,而在配置文中就配置的是单结点的方式。 Moved表示使…

从人工巡检到智能防控:智慧油气田安全生产的新视角

一、背景需求 随着科技的飞速发展,视频监控技术已成为各行各业保障安全生产、提升管理效率的重要手段。特别是在油气田这一特殊领域,由于其工作环境复杂、安全风险高,传统的监控方式已难以满足实际需求。因此,基于视频监控AI智能…

NLP教程:1 词袋模型和TFIDF模型

文章目录 词袋模型TF-IDF模型词汇表模型 词袋模型 文本特征提取有两个非常重要的模型: 词集模型:单词构成的集合,集合自然每个元素都只有一个,也即词集中的每个单词都只有一个。 词袋模型:在词集的基础上如果一个单词…

springcolud学习04Ribbon

Ribbon Ribbon是一个用于构建分布式系统的开源项目,最初由Netflix开发。它是一个基于HTTP和TCP客户端负载均衡器,用于将客户端的请求分发到多个服务实例上,以提高系统的性能和可靠性。Ribbon提供了许多负载均衡算法和配置选项,可…

maven内网依赖包编译报错问题的一种解决方法

背景 外网开发时可以连接互联网,所以编译没有什么问题,但是将数据库、代码、maven仓库全部拷贝到内网,搭建内网环境之后,编译失败。 此依赖包的依赖层级图 maven镜像库配置使用拷贝到内网的本地库,配置如下&#xff…

WebRTC音视频-前言介绍

目录 效果预期 1:WebRTC相关简介 1.1:WebRTC和RTC 1.2:WebRTC前景和应用 2:WebRTC通话原理 2.1:媒体协商 2.2:网络协商 2.3:信令服务器 效果预期 1:WebRTC相关简介 1.1&…

24位动态信号采集卡8路同步音频震动信号采集IEPE采集卡USB8814

24位动态信号采集卡 音频震动信号采集USB8814实测演示 品牌:阿尔泰科技 产品概述: USB8814 是一款为测试音频和振动信号而设计的高精度数据采集卡。该板卡提供 8 路同步模拟输 入通道,24bit 分辨率,单通道采样速率zui高 204.8kSP…

4.定时器

原理 时钟源:定时器是内部时钟源(晶振),计数器是外部计时长度:对应TH TL计数器初值寄存器(高八位,低八位)对应的中断触发函数 中断源中断处理函数Timer0Timer0_Routine(void) interrupt 1Timer1Timer1_Routine(void) …

css list布局 高端玩法

这种布局方式 通常父级item 使用display:flex; 子集list使用margin-right margin-bottom撑开距离 然后得纠结最后一个子集的margin什么的 有个新思路子集使用padding <div class"video-box"><div class"video-list" v-for"item in videoLis…

系统架构设计师教程(清华第二版) 第3章 信息系统基础知识-3.3 管理信息系统(MIS)-解读

系统架构设计师教程 第3章 信息系统基础知识-3.3 管理信息系统(MIS) 3.3.1 管理信息系统的概念3.3.1.1 部件组成3.3.1.2 结构分类3.3.1.2.1 开环结构3.3.1.2.2 闭环结构3.3.1.3 金字塔结构3.3.2 管理信息系统的功能3.3.3 管理信息系统的组成3.3.3.1 销售市场子系统3.3.3.2…

前端学习(二)之HTML

一、HTML文件结构 <!DOCTYPE html> <!-- 告诉浏览器&#xff0c;这是一个HTML文件 --><html lang"en"> <!-- 根元素&#xff08;起始点&#xff0c;最外层容器&#xff09; --><head> <!-- 文档的头部&#xff08;元信息&#xff…

【JVM基础03】——组成-详细介绍下Java中的堆

目录 1- 引言&#xff1a;堆1-1 堆是什么&#xff1f;(What)1-2 为什么用堆&#xff1f;堆的作用 (Why) 2- ⭐核心&#xff1a;堆的原理&#xff08;How&#xff09;2-1 堆的划分2-2 Java 7 与 Java 8 的堆区别 3- 小结&#xff1a;3-1 详细介绍下Java的堆&#xff1f;3-2 JVM …

静态网站怎么更新数据

今天看到个问题 我不是行业从业者&#xff0c;但目前遇到一个问题 我公司网站为纯静态&#xff0c;除了直接从html里修改文字外能不能这样 建立一个xml或者txt文档&#xff0c;其中有很多信息&#xff0c;例如网站名称&#xff0c;电话&#xff0c;备案号等&#xff0c;一行一行…

SAPUI5基础知识15 - 理解控件的本质

1. 背景 经过一系列的练习&#xff0c;通过不同的SAPUI5控件&#xff0c;我们完成了对应用程序界面的初步设计&#xff0c;在本篇博客中&#xff0c;让我们一起总结下SAPUI5控件的相关知识点&#xff0c;更深入地理解SAPUI5控件的本质。 通常而言&#xff0c;一个典型UI5应用…

vscode通过ssh链接远程服务器上的docker

目录 1 编译docker image1.1 编译镜像1.2 启动镜像 2 在docker container中启动ssh服务2.1 确认是否安装ssh server2.2 修改配置文件2.3 启动ssh服务 3 生成ssh key4 添加ssh公钥到docker container中5 vscode安装插件Remote - SSH6 在vscode中配置 1 编译docker image 一般来…

【flink】之如何快速搭建一个flink项目

1.通过命令快速生成一个flink项目 curl https://flink.apache.org/q/quickstart.sh | bash -s 1.19.1 生成文件目录&#xff1a; 其中pom文件包好我们所需要的基础flink相关依赖 2.测试 public class DataStreamJob {public static void main(String[] args) throws Except…