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

PessimisticLock

想象你和你的朋友都想去图书馆借同一本非常受欢迎的小说。为了确保你们中的一位能够成功借到这本书,图书馆采用了悲观锁机制来管理借阅过程。

悲观锁的方式
  1. 查看书籍状态:当你到达图书馆并决定要借这本小说时,你先告诉图书管理员你想借这本书。此时,图书管理员会立即在系统中标记这本书为“正在处理”,这意味着其他任何人现在都不能再选择或预订这本书。
  2. 准备借书:接着,图书管理员开始为你办理借书手续,比如检查你的借书证、记录借阅信息等。在这段时间里,即使你的朋友也来到图书馆想要借同样的书,他们也会被告知这本书当前不可借用。
  3. 完成借书:一旦所有的手续都完成了,图书管理员会正式将书借给你,并更新系统的状态,表明这本书已经被借出。如果在这个过程中有任何问题导致无法完成借书,图书管理员会取消标记,并重新开放这本书的借阅权限。
  4. 释放资源:当你最终拿到书后,图书管理员解除对这本书的锁定,允许其他人再次尝试借阅它。

悲观锁的核心思想

  • 假设冲突经常发生:悲观锁认为并发修改是很常见的事情,因此它会在一开始就采取措施防止冲突的发生。
  • 提前锁定资源:当一个用户需要访问或修改某个资源时,悲观锁会立即将该资源锁定,阻止其他用户同时进行相同的操作。
  • 保持锁定直到操作完成:资源一直保持锁定状态,直到当前用户的操作完全结束,包括提交或回滚。
  • 阻塞其他请求:在资源被锁定期间,所有其他试图访问同一资源的请求都将被阻塞,必须等待当前操作完成。

Java中的悲观锁应用

在Java编程中,悲观锁通常通过显式地使用锁对象(如 ReentrantLock)或者数据库事务中的行级锁来实现。下面是一个简化示例,展示如何使用悲观锁控制对共享资源的访问:

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class Book {private final Lock lock = new ReentrantLock();private boolean isAvailable = true;public void borrow() {// 获取锁,确保同一时间只有一个线程能执行以下代码块lock.lock();try {if (isAvailable) {System.out.println("成功借到了书!");isAvailable = false;} else {System.out.println("书已被借走,无法借阅。");}} finally {// 无论是否成功借书,最后都要释放锁lock.unlock();}}public void returnBook() {// 获取锁,确保同一时间只有一个线程能执行以下代码块lock.lock();try {if (!isAvailable) {System.out.println("书已归还!");isAvailable = true;} else {System.out.println("这本书已经可借了。");}} finally {// 无论是否成功归还书,最后都要释放锁lock.unlock();}}
}

        在这个例子中,borrow()returnBook() 方法都使用了 ReentrantLock 来实现悲观锁。当一个线程调用这些方法时,它会首先获取锁,然后执行相应的逻辑,最后确保总是释放锁。这样就保证了在同一时间点上,只有一个线程能够改变 Book 的状态,从而避免了并发冲突。

        悲观锁是一种保守的并发控制策略,它通过提前锁定资源来防止并发冲突。虽然这种方法可能会降低系统的并发性能,因为它可能导致其他请求被阻塞,但它提供了更强的数据一致性和安全性,特别适合那些写操作频繁且冲突可能性较高的场景。例如,在金融交易、库存管理和票务预订等领域,悲观锁可以帮助确保数据的准确性和完整性。

相关文章:

PessimisticLock

想象你和你的朋友都想去图书馆借同一本非常受欢迎的小说。为了确保你们中的一位能够成功借到这本书,图书馆采用了悲观锁机制来管理借阅过程。 悲观锁的方式 查看书籍状态:当你到达图书馆并决定要借这本小说时,你先告诉图书管理员你想借这本…...

【Maven】属性管理

1. 属性 问题导入 定义属性有什么好处&#xff1f; 1.1 属性配置与使用 ①&#xff1a;定义属性 <!--定义自定义属性--> <properties><spring.version>5.2.10.RELEASE</spring.version><junit.version>4.12</junit.version> </prop…...

微信小程序性能优化、分包

性能优化是任何应用开发中的重要组成部分&#xff0c;尤其是在移动环境中。对于微信小程序而言&#xff0c;随着用户量的增加和应用功能的丰富&#xff0c;性能优化显得尤为关键。良好的性能不仅提升用户体验&#xff0c;还能增加用户留存率和应用的使用频率。我们将探讨如何在…...

TDengine 新功能 VARBINARY 数据类型

1. 背景 VARBINARY 数据类型用于存储二进制数据&#xff0c;与 MySQL 中的 VARBINARY 数据类型功能相同&#xff0c;VARBINARY 数据类型长度可变&#xff0c;在创建表时指定最大字节长度&#xff0c;使用进按需分配存储&#xff0c;但不能超过建表时指定的最大值。 2. 功能说明…...

【Maven】工程依赖下载失败错误解决

在使用 Maven 构建项目时&#xff0c;可能会发生依赖项下载错误的情况&#xff0c;主要原因有以下几种&#xff1a; 下载依赖时出现网络故障或仓库服务器宕机等原因&#xff0c;导致无法连接至 Maven 仓库&#xff0c;从而无法下载依赖。 依赖项的版本号或配置文件中的版本号错…...

windows系统下使用cd命令切换到D盘的方法

windows系统下使用cd命令切换到D盘的方法 系统环境配置 win10系统原装C盘后期自己安装的硬盘D盘 python3.8安装在D盘中 问题说明 winR打开终端&#xff0c;使用 cd d:命令&#xff0c;无法将当前目录切换到D盘 解决方法 方法一&#xff1a;使用下面这条命令 cd /d d:运…...

嵌入式小白

1、看门狗 看门狗”就是一个计数器&#xff0c;由于位数有限计数器能够装的数值是有限的(比如8位的最多装256个数、16位的最多装65536个数)&#xff0c;从开启“看门狗”那刻起&#xff0c;它就开始不停的数机器周期&#xff0c;数一个机器周期就计数器加&#xff11;&#xf…...

xilinx 芯片使用vivado导出pindelay文件——FPGA学习笔记24

1、创建一个空的工程 2、在TCL命令窗输入 link_design -part xc7a35tfgg484-2&#xff08;芯片型号&#xff09;回车 3、输入write_csv xc7a35tfgg484-2(文件类型和文件名字) 回车&#xff0c;导出文件在该目录下 4、导出文件...

自研开发哪有什么捷径

许多同行看我平台成长得这么快&#xff0c;都在借机问我是不是有什么现成的模板可借鉴&#xff0c;开源的资源取巧一下。我就寻思哪有这么多现成的模板&#xff0c;有这巧劲去找好用的开源软件&#xff0c;不如踏踏实实自己设计。要我说&#xff0c;做研发的&#xff0c;除了得…...

【Mac】终端改色-让用户名和主机名有颜色

效果图 配置zsh 1.打开终端&#xff0c;进入.zshrc配置 cd ~ vim .zshrc2.添加如下配置并保存 # 启用命令行颜色显示 export CLICOLOR1 ## 加载颜色支持 autoload -U colors && colors # 配置 zsh 提示符 PROMPT"%{$fg_bold[red]%}%n%{$reset_color%}%{$fg_bol…...

ShenNiusModularity项目源码学习(6:访问控制)

ShenNius.Admin.API项目中的控制器类的函数如果需要访问控制&#xff0c;主要是调用ShenNius.Infrastructure项目下的AuthorityAttribute特性类实现的。AuthorityAttribute继承自ActionFilterAttribute抽象类&#xff0c;后者用于在调用控制器操作函数前后自定义处理逻辑&#…...

STM32F103RCT6学习之三:串口

1.串口基础 2.串口发送 1&#xff09;基本配置 注意&#xff1a;实现串口通信功能需在keil中设置打开Use Micro LIB&#xff0c;才能通过串口助手观察到串口信息 2)编辑代码 int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration-------------…...

js 计算税率错误——如何处理

处理方法 var 税额Number(price_notax)*Number(tax_rate)/100;税额税额.toFixed(2);var 含税单价Number(price_notax)Number(税额);var 非小计Number(price_notax)*Number(common_num);var 含税小计Number(含税单价)*Number(common_num);含税小计含税小计.toFixed(2); 税额税额…...

12. 日常算法

1. 主持人调度&#xff08;一&#xff09; 题目来源 class Solution { public:bool hostschedule(vector<vector<int>>& schedule) {// write code heresort(schedule.begin(), schedule.end());int start -1, end 0;for (auto & nums : schedule){end…...

HarmonyOS Next 实现登录注册页面(ARKTS) 并使用Springboot作为后端提供接口

1. HarmonyOS next ArkTS ArkTS围绕应用开发在 TypeScript &#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集 ArkTS在TS的基础上扩展了struct和很多的装饰器以达到描述UI和状态管理的目的 以下代码是一个基于…...

咖啡即将“从天而降”,无人机外卖时代来袭

如今&#xff0c;在我国的一些城市&#xff0c;无人机配送咖啡已经从设想变为现实&#xff0c;开启了商业化的初步尝试。 当咖啡遇上无人机&#xff0c;奇妙场景开启 想象一下这样的画面&#xff1a;你在户外的露营地&#xff0c;慵懒地躺在帐篷里&#xff0c;或是在城市公园…...

kettle经验篇:Pentaho Repository 类型资源库卡顿问题

2024年马上就结束了&#xff0c;终于在结束前解决了困扰许久的一个问题&#xff1a;kettle的Pentaho Repository 资源库异常卡顿。所以在此也梳理、记录下2024年的最后一个大问题。 项目场景 工作中一个重要内容是数据中心项目&#xff0c;也就必不可少的要用到ETL技术&#x…...

python opencv的sift特征检测(Scale-Invariant Feature Transform)

sift 官方文档地址&#xff1a;https://docs.opencv.org/4.10.0/da/df5/tutorial_py_sift_intro.html 创建SIFT实例cv2.SIFT.create()特征检测sift.detect描述子sift.compute/sift.detectAndCompute画特征cv2.drawKeypoints 原图 特征点 代码 import cv2first ./12.pngsif…...

若依定时任务

表结构 目录 quartz框架 SysJobServiceImpl实现类 使用切点,在构造器执行的时候执行定时任务的构建(这个类是交给IOC容器的,所以这个时间点就是项目启动的时候)SysJobServiceImpl实现类的init方法创建任务 /*** 创建定时任务*/public static void createScheduleJob(Scheduler …...

k8s-node2 NotReady 节点NotReady如何解决?

从集群中移除 k8s-node2 [rootk8s-master ~]# kubectl delete node k8s-node2 node "k8s-node2" deleted重置 k8s-node2 登录到 k8s-node2 上&#xff0c;使用以下命令重置该节点&#xff0c;使其退出集群并恢复到初始状态&#xff1a; [rootk8s-node2 ~]# sudo k…...

OpenClaw多模态扩展:Qwen3.5-4B-Claude分析截图内容

OpenClaw多模态扩展&#xff1a;Qwen3.5-4B-Claude分析截图内容 1. 为什么需要截图分析能力 上周我在整理项目文档时遇到了一个典型问题&#xff1a;客户发来的需求变更截图散落在十几个微信对话中&#xff0c;我需要手动对照图片内容更新PRD文档。这种机械操作不仅耗时&…...

告别拼接!深入对比鸿蒙与Android的multipart请求封装差异

鸿蒙与Android的multipart请求封装差异&#xff1a;从手动拼接到底层优化 在移动应用开发中&#xff0c;文件上传是一个常见但容易出错的场景。当我们需要同时上传文本和二进制数据时&#xff0c;multipart/form-data协议就成为了标准解决方案。然而&#xff0c;不同平台对这一…...

Qwen3-ASR-1.7B与Python爬虫结合实战:音频数据采集与智能分析流水线

Qwen3-ASR-1.7B与Python爬虫结合实战&#xff1a;音频数据采集与智能分析流水线 1. 为什么需要这套音频分析流水线 最近在帮一家做社交媒体舆情监控的团队搭建分析系统时&#xff0c;他们提出了一个很实际的问题&#xff1a;视频平台里大量用户评论是以语音形式存在的&#x…...

Qwen3-ASR-1.7B在数学建模竞赛中的语音数据处理应用

Qwen3-ASR-1.7B在数学建模竞赛中的语音数据处理应用 数学建模竞赛&#xff0c;听起来是不是有点“高大上”&#xff1f;其实说白了&#xff0c;就是给你一个现实世界的问题&#xff0c;让你用数学和计算机的方法去解决。这几年&#xff0c;竞赛题目越来越贴近生活&#xff0c;…...

LumiPixel模型API接口调用详解:Python/Node.js快速集成

LumiPixel模型API接口调用详解&#xff1a;Python/Node.js快速集成 1. 前言&#xff1a;为什么选择API集成 如果你正在开发一个需要AI生成能力的应用&#xff0c;直接调用现成的模型API可能是最高效的方式。LumiPixel Canvas Quest模型提供了简单易用的API接口&#xff0c;让…...

vLLM-v0.17.1效果展示:vLLM在中文长文本摘要任务中的准确率实测

vLLM-v0.17.1效果展示&#xff1a;vLLM在中文长文本摘要任务中的准确率实测 1. vLLM框架简介 vLLM是一个专注于提升大语言模型推理效率的开源库&#xff0c;它的核心目标是让开发者能够更轻松地部署和使用各类大模型。这个项目最初由加州大学伯克利分校的研究团队发起&#x…...

文脉定序系统压力测试与性能监控方案

文脉定序系统压力测试与性能监控方案 最近不少朋友在部署完文脉定序系统后&#xff0c;都会来问我同一个问题&#xff1a;“服务上线了&#xff0c;心里还是没底&#xff0c;怎么知道它能扛住多少用户同时访问&#xff1f;平时运行稳不稳定&#xff1f;” 这确实是个很实际的问…...

Qwen3-0.6B-FP8实操手册:多轮对话记忆机制与上下文控制技巧

Qwen3-0.6B-FP8实操手册&#xff1a;多轮对话记忆机制与上下文控制技巧 1. 引言&#xff1a;为什么你需要关注对话记忆&#xff1f; 想象一下&#xff0c;你跟一个朋友聊天&#xff0c;聊了十分钟后&#xff0c;你问他&#xff1a;“我们刚才说到哪了&#xff1f;”他一脸茫然…...

AIGlasses_for_navigation 模型微调教程:使用自定义数据适配特定场景

AIGlasses_for_navigation 模型微调教程&#xff1a;使用自定义数据适配特定场景 你是不是觉得&#xff0c;那些通用的导航模型&#xff0c;在工厂车间或者医院走廊里用起来&#xff0c;总有点“水土不服”&#xff1f;路线规划可能没错&#xff0c;但遇到一些特殊的设备、标识…...

【信号处理实战】从原理到代码:手把手实现三次样条插值

1. 三次样条插值&#xff1a;从数学定义到生活场景 想象你正在用一根柔软的弹性尺子连接一组图钉&#xff0c;这些图钉固定在木板上代表你的数据点。这根尺子需要光滑地穿过每一个图钉&#xff0c;同时保持自然的弯曲形态——这就是三次样条插值要解决的问题。作为信号处理中最…...