Java高并发控制之按业务对象加同步锁
一、需求
最常见的一个场景,账户余额更新! 业务场景稍复杂点,一个客户有多个虚拟余额账户,产生交易时,需要同时更新客户的多个余额账户,现在需要为余额更新做并发控制。
二、解决方案
1、依赖数据的乐观锁,内存中不做更新余额的判断,update语句中增加条件,扣减的金额必须小于当前余额,代码中以返回的更新行数判断是否扣减成功。
2、由于一些原因,逼着这里采用的是代码中加锁来解决的,首先需要明确一个前提,如下代码中加同步锁的方案是针对单节点的服务,若是多节点,则无法控制并发了。
三、核心代码
锁的颗粒度:最暴力的同步锁就是整个方法加同步,这样是以牺牲接口性能为代价一刀切的做法,笔者这里实现的是按客户余额账号加锁,同一个账号(账号唯一)更新余额加锁控制即可,不同的账户可以同时更新余额,逻辑上并不冲突。
/*** 账户信息*/
@Slf4j
@Component
public class AccountDemo{// 同步锁容器,一定注意容器必须是线程安全的private final Map<String, Object> accountLocks = new ConcurrentHashMap<>();public int updateBalance( String accountNo, long amount) {if (StrUtil.isBlank(accountNo)) {throw new ServiceException(EnumErrorCode.EC_COMMON_REQ_PARAM_ERROR);}if (amount == 0) {log.warn("amount is zero.");return 1;}// 根据账户ID获取或创建锁对象Object lock = accountLocks.computeIfAbsent(accountNo, k -> new Object());synchronized (lock) {// 判断客户余额是否充足if (checkBalance(accountNo, amount)) {throw new ServiceException("余额不足!"); }// 更新余额代码实现int update = updateBalance(accountNo, amount);}return update;}}
注意:该方法或方法上游加事务控制要特别小心,笔者在外层增加了事务控制,就导致了方法里面锁的执行顺序控制失效了!
相关文章:
Java高并发控制之按业务对象加同步锁
一、需求 最常见的一个场景,账户余额更新! 业务场景稍复杂点,一个客户有多个虚拟余额账户,产生交易时,需要同时更新客户的多个余额账户,现在需要为余额更新做并发控制。 二、解决方案 1、依赖数据的乐观锁&…...
Python魔法函数__iter__的用法
下面是找到的一个比较好的科学解释: Python中可迭代对象(Iterable)并不是指某种具体的数据类型,它是指存储了元素的一个容器对象,且容器中的元素可以通过__iter__( )方法或__getitem__( )方法访问。 1.__iter__方法的作用是让对象可以用for…...
Redis-缓存一致性
缓存双写一致性 更新策略探讨 面试题 缓存设计要求 缓存分类: 只读缓存:(脚本批量写入,canal 等)读写缓存 同步直写:vip数据等即时数据异步缓写:允许延时(仓库,物流&a…...
SAP学习笔记 - 豆知识13 - Msg 番号 NR751 - Object RF_BELEG R100、番号範囲間隔 49 不存在 FBN1
其实这种就是自动採番的番号没弄。 比如跨年了,那该新年度的番号范围没弄啊,就会出这种错误。 把番号范围给加一下就可以了。 1,现象 比如点 VL02N 出荷传票变更 画面,点 出库确认 就会出如下错误: Object RF_BEL…...
美摄科技云服务解决方案,方案成熟,接入简单
美摄科技作为视频处理领域的先锋,凭借其强大的技术实力和深厚的行业经验,推出了成熟的云服务解决方案,为轻量化视频制作开辟了全新的道路。 一、成熟方案,接入无忧 美摄科技云服务解决方案的最大亮点在于其成熟度和易用性。我们…...
【bug】paddleocr draw_ocr_box_txt ValueError: incorrect coordinate type
【bug】paddleocr draw_ocr_box_txt ValueError: incorrect coordinate type 环境 python 3.10.15pillow 10.4.0 paddleocr 2.8.1错误详情 错误文本 Traceback (most recent call last):....draw_left.polygon(box, fillcolor)ValueError: inco…...
python的多线程和多进程
首先需要明确的是,多进程和其他语言的一样,能够利用多核cpu,但是python由于GIL的存在,多线程在执行的时候,实际上,每一时刻只有一个线程在执行。相当于是单线程。然而多线程在某些情况下,还是能…...
基于SpringBoot+Vue+uniapp的时间管理小程序的详细设计和实现(源码+lw+部署文档+讲解等)
详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不…...
HMAC-MD5参数签名算法
更多中电联在线工具 HMAC-MD5 是一种基于 MD5 哈希函数的消息认证码(MAC)算法。它用于确保消息的完整性和认证,通常用于数据传输和 API 请求。其基本步骤如下: 密钥准备:选择一个密钥(K)&#…...
【word】文章里的表格边框是双杠
日常小伙伴们遇到word里插入的表格,边框是双杠的,直接在边框和底纹里修改边框的样式就可以,但我今天遇到的这个有点特殊,先看看表格在word里的样式是怎么样,然后我们聊聊如何解决。 这个双杠不是边框和底纹的设置原因…...
我常用的两个单例模式写法 (继承Mono和不继承Mono的)
不继承Mono 不继承Mono代表不用挂载到场景物体上面,因此直接饿汉式 加 合并空运算符判空创建实例 >(lambda表达式)的意思是get,就是将instance赋给Instance属性 //单例private static JsonDataManager instance new JsonDataManager();public stati…...
Android 自定义Toast显示View
1、创建一个tosat显示的布局文件:toast_custom.xml <?xml version"1.0" encoding"utf-8"?> <com.hjq.shape.layout.ShapeLinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width&…...
SCRM呼叫中心高保真Axure原型 源文件分享
在数字化时代,客户关系管理(CRM)对于企业的成功至关重要。SCRM呼叫中心后台作为一款专为CRM设计的软件原型,致力于为企业提供高效、智能的客户沟通解决方案。本文将详细介绍该产品的核心功能及其对企业提升客户满意度和销售业绩的…...
Ubuntu(Linux)tcpdump使用方法详解
tcpdump命令 1.从所有网卡获取数据包 tcpdump -i any2.从指定网卡获取数据包 tcpdump -i eth03.指定网卡,IP,写文件 tcpdump -i eth0 host 192.168.16.101 -w ./tcp.dat //host 后面是发送方的地址4.指定网卡,源IP且目的IP,写入…...
Centos安装Nginx 非Docker
客户的机器属于 Centos7 系列,由于其较为陈旧,2024开始众多镜像和软件源都已失效。此篇文章将详细记录在 Centos7 操作系统上从零开始安装 Nginx 的整个流程。 本文Nginx是安装在/usr/local/nginx下 详细步骤如下: 准备Nginx安装包&#x…...
免费版的音频剪辑软件:这四款有没有你的菜?
随着音频编辑需求的日益增长,免费的音频剪辑软件逐渐成为许多创作者、学生和普通用户的心头好。今天,就让我为大家介绍几款热门的免费音频剪辑软件,并分享一下我的使用感受吧! 一、福昕音频剪辑 直通车(复制粘贴到网站…...
Facebook的隐私之战:数据保护的挑战与未来
在数字化时代,隐私保护成为了公众关注的焦点,尤其是在社交媒体巨头Facebook身上。随着用户数据泄露事件的频发,Facebook面临着日益严峻的隐私挑战。这些挑战不仅涉及法律法规的遵循,还影响着用户信任、公司声誉以及未来的发展方向…...
自定义注解和组件扫描在Spring Boot中动态注册Bean(二)
在Spring Boot中,自定义注解和组件扫描是实现动态注册Bean的两种重要手段。通过它们,开发者可以灵活地管理Spring容器中的Bean,提高开发效率和代码的可维护性。本文将详细讲解自定义注解和组件扫描在Spring Boot中如何动态注册Bean。 自定义…...
常见网络协议的介绍、使用场景及 Java 代码样例
以下是几种常见网络协议的介绍、使用场景及 Java 代码样例: 一、HTTP(HyperText Transfer Protocol,超文本传输协议) 介绍: HTTP 是用于在 Web 浏览器和 Web 服务器之间传输超文本的应用层协议。基于请求 - 响应模式…...
音视频好文总结
RTSP play同步 ffplay播放器研究分析 ffplay播放器 暂停、逐帧、音量、快进快退seek功能分析 RTSP RTP RTCP SDP基础知识 flv格式分析与解复用 TS格式详解 m3u8格式详解 FLV格式详解 MP4格式详解 HLS协议详解 RTMP协议详解 HTTP-FLV协议详解 H.264 SPS、PPS详解 H…...
Pixel Language Portal部署案例:在信创环境(麒麟OS+海光CPU)中运行Hunyuan-MT-7B
Pixel Language Portal部署案例:在信创环境(麒麟OS海光CPU)中运行Hunyuan-MT-7B 1. 项目背景与价值 **像素语言跨维传送门(Pixel Language Portal)**是基于腾讯Hunyuan-MT-7B大模型构建的创新翻译工具,其独特的16-bit像素冒险界…...
什么是共轭表达式?解决了什么问题?
什么是共轭表达式?解决了什么问题?为什么导数是 1/x? 导数衡量的是“每增加 1 单位的 xxx,y 能增加多少”...
用快马平台五分钟搭建countif函数交互演示原型,告别枯燥文档
最近在帮同事做Excel培训时,发现很多人对countif函数的使用总是一知半解。传统的文档说明太抽象,于是我尝试用InsCode(快马)平台快速搭建了一个交互式演示工具,效果出乎意料的好。整个过程只用了不到5分钟,完全不需要操心环境配置…...
从俄罗斯电商数据到销量预测:Kaggle竞赛项目实战中的特征工程避坑指南
俄罗斯电商销量预测实战:特征工程中的7个关键陷阱与解决方案 在Kaggle的"Predict Future Sales"竞赛中,俄罗斯电商数据呈现出一系列独特挑战。本文将深入剖析特征工程环节中最易踩中的7个陷阱,并分享经过实战验证的解决方案。 1.…...
MacBook Pro 触控板锁屏快捷设置指南
1. 为什么需要触控板快速锁屏功能 作为一个每天要处理大量敏感文档的MacBook Pro用户,我深刻理解快速锁屏的重要性。想象一下这样的场景:你正在咖啡馆处理工作邮件,突然需要去洗手间或者接电话,这时候如果慢慢点击菜单栏或者记忆复…...
为什么国内还没有出现网络安全巨头公司
国内坐拥广阔市场、政策持续加码,却始终没能诞生一家具备全球话语权、真正统领行业的龙头企业。看似热闹的产业图景背后,并非技术实力缺位,而是从需求逻辑、商业模式到市场生态,全链条深陷结构性困局,从根源上锁死了网…...
基于FPGA的机器视觉缺陷检测实现铝片表面四缺陷精准检测:源码及测试文件共享,SSD-Mobi...
基于FPGA机器视觉缺陷检测 实现铝片表面四种缺陷的检测 包含源码和端测文件 使用SSD-MobileNetV1模型,识别精度达到85%以上。在工业检测领域,金属板表面缺陷检测的效率与精度直接影响产品质量管控水平。本文聚焦基于FPGA的机器视觉缺陷检测系统ÿ…...
新手友好:借助快马平台的免费token轻松迈出AI应用开发第一步
作为一名刚接触AI开发的新手,我最近在InsCode(快马)平台上完成了一个文本摘要生成器的项目,整个过程非常顺畅。这个平台对初学者特别友好,尤其是提供了免费token,让我们可以零成本体验AI开发的乐趣。 理解token的概念 刚开始我对…...
脑机接口(BCI)全景解析:从原理到产业,开发者入局指南
脑机接口(BCI)全景解析:从原理到产业,开发者入局指南 引言 从帮助渐冻症患者“开口说话”,到用“意念”操控无人机,脑机接口(BCI)正从科幻走进现实,成为“AI for Scienc…...
2025届学术党必备的六大降重复率网站解析与推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 为了降低AIGC检测率,要从文本特征着手。首先,对词汇多样性加以调整&a…...
