当前位置: 首页 > 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…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...