C# lock使用的逻辑和情景

devtools/2025/1/22 7:19:32/

情景:扣库存,会出现超扣的情况,因为同一个单子会有不同的工作人员使用,要保证数据的一致性。那么就用锁。

  1. 优化锁对象管理
    使用 Lazy 初始化锁对象:
    使用 ConcurrentDictionary 的 GetOrAdd 方法结合 Lazy 确保锁对象只被创建一次,避免多次创建。

  2. 减少锁的持有时间:避免长时间阻塞其他线程
    思路:尽量减少在 lock 代码块内的操作,只将必须同步的代码放在其中。

  3. 处理异常情况
    思路:对于异常情况,确保锁的正确释放,避免死锁或其他并发问题。

using System;
using System.Collections.Concurrent;
using System.Threading;class InventoryManager
{private static ConcurrentDictionary<string, Lazy<object>> lockObjects = new ConcurrentDictionary<string, Lazy<object>>();public static void ProcessOrder(int orderId, string material, string batch){string key = $"{material}:{batch}";Lazy<object> lockObject = lockObjects.GetOrAdd(key, new Lazy<object>(() => new object()));object actualLock = lockObject.Value;try{int productId = 0;int quantity = 0;// 先获取订单信息,不使用锁// 模拟从销售订单表获取订单信息// 提取产品 ID 和数量lock (actualLock){// 处理订单逻辑,包括销售订单、库存表、虚拟库存表的操作Console.WriteLine($"Processing order {orderId} for material {material} and batch {batch}");// 模拟从销售订单表获取订单信息// 模拟从库存表扣减库存// 模拟更新虚拟库存表Thread.Sleep(1000); }}catch (Exception ex){Console.WriteLine($"Error processing order: {ex.Message}");}}
}

http://www.ppmy.cn/devtools/152529.html

相关文章

STM32的集成开发环境STM32CubeIDE安装

STM32CubeIDE - STM32的集成开发环境 - 意法半导体STMicroelectronics 一、点击安装包时出现以下错误时&#xff0c;原因是安装包所在路径存在中文字符。

深入剖析 JVM 内存模型

前言&#xff1a; 下面分别介绍了新生代和老年代的不同收集器及其相关子类型&#xff0c;并附有示例代码和说明&#xff0c;感兴趣的朋友可以参考一下。 简介&#xff1a; 在 Java 虚拟机&#xff08;JVM&#xff09;的世界里&#xff0c;内存模型是其核心架构之一&#xff0…

CBAM-2018学习笔记

名称&#xff1a; Convolutional Block Attention Module (CBAM) 来源&#xff1a; CBAM: Convolutional Block Attention Module 相关工作&#xff1a; #ResNet #GoogleNet #ResNeXt #Network-engineering #Attention-mechanism 创新点&#xff1a; 贡献&#xff1a; 提…

美区TikTok解封后如何回归使用?

随着2025年初美区TikTok解封的消息引起了广泛关注&#xff0c;许多用户纷纷开始重新关注这一全球最受欢迎的短视频平台。在经历了数月的禁用期后&#xff0c;TikTok在美国市场的回归&#xff0c;代表了这一平台的巨大潜力和挑战。从用户的使用习惯&#xff0c;到平台的内容策略…

5、原来可以这样理解C语言_数组(5)sizeof 计算数组元素个数

目录 5. sizeof 计算数组元素个数 5. sizeof 计算数组元素个数 在遍历数组的时候&#xff0c;我们经常想知道数组的元素个数&#xff0c;那C语⾔中有办法使⽤程序计算数组元素个数 吗&#xff1f; 答案是有的&#xff0c;可以使⽤sizeof。 sizeof 中C语⾔是⼀个关键字&#xff…

使用 JUnit 和 SuiteRunner 测试私有方法

我第一次使用 JUnit 是为了为 ServiceUI API 构建一个一致性测试工具包 [ 1 ]。一致性测试工具包的目的是帮助确保同一 API 的替代实现与 API 的规范兼容。由于 API 规范仅定义 API 的公共接口&#xff0c;而不是 API 的实现&#xff0c;因此一致性测试仅测试公共接口。换句话说…

kubernetes v1.29.XX版本HPA、KPA、VPA并压力测试

序言&#xff1a; 在大型电商、购物、直播活动期间&#xff0c;对于火爆流量的激增&#xff0c;如何保障业务稳定并且做到资源不浪费&#xff0c;自动回收。 场景&#xff1a;kubernetes 原生容器化承载业务流量&#xff08;非云环境&#xff09; 方案&#xff1a;kubernetes自…

Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat

目录 ?编辑 一、Ubuntu22.04介绍 二、Ubuntu与Centos的区别 三、基于VMware安装Ubuntu Server 22.04 下载 VMware安装 1.创建新的虚拟机 2.选择类型配置 3.虚拟机硬件兼容性 4.安装客户机操作系统 5.选择客户机操作系统 6.命名虚拟机 7.处理器配置 8.虚拟机内存…