理解多线程问题(银行取钱为例)
深入理解Java多线程从银行取钱案例解析线程安全问题在并发编程的世界里线程安全是一道绕不开的坎。就像银行取钱时若多个用户同时操作同一账户稍不注意就会出现“余额超扣”“重复扣款”等问题。今天我们就以银行取钱为场景聊聊Java多线程中的线程安全与同步机制。一、场景还原为什么会出现线程安全问题假设某银行账户初始余额为1000元有两个用户同时尝试取钱每次取200元各取5次。如果没有任何“锁”的保护会发生什么用户A判断余额≥200准备扣款此时CPU切换到用户B用户B也判断余额≥200准备扣款最终两个用户都“成功”取走200元但账户实际只扣了200元出现数据不一致即线程安全问题。二、代码实现模拟银行取钱的线程安全问题与解决我们通过三个类来模拟这个场景 BankAccount 银行账户、 WithdrawThread 取钱线程、 BankTest 测试类。1. 银行账户类BankAccountpublic class BankAccount { public double balance 1000; // 初始余额1000元 }2. 取钱线程类WithdrawThreadpublic class WithdrawThread implements Runnable { public BankAccount account; public WithdrawThread(BankAccount account) { this.account account; } public void run() { for (int i 0; i 5; i) { // 模拟取5次钱 try { Thread.sleep(10); // 模拟取钱耗时放大并发问题 } catch (InterruptedException e) { throw new RuntimeException(e); } // 同步代码块通过“对象锁”保证操作原子性 synchronized (this) { if (account.balance 200) { // 每次取200元 System.out.println(Thread.currentThread().getName() 取出200元剩余余额 (account.balance - 200)); account.balance - 200; } else { System.out.println(Thread.currentThread().getName() 取钱失败余额不足); } } } } }3. 测试类BankTestpublic class BankTest { public static void main(String[] args) { BankAccount account new BankAccount(); WithdrawThread wt new WithdrawThread(account); // 启动两个线程模拟两个用户同时取钱 new Thread(wt, 用户1).start(); new Thread(wt, 用户2).start(); } }三、核心原理synchronized同步机制在 WithdrawThread 的 run 方法中我们使用了 synchronized (this) 来保护取钱逻辑。它的核心作用是给这段代码加一把“锁”同一时间只有一个线程能执行被锁住的代码块。锁的对象这里用的是 this 即 WithdrawThread 的实例对象确保两个线程竞争同一把锁。原子性保证“判断余额是否充足”和“扣款”这两个操作被合并为一个“原子操作”不会被其他线程打断。四、运行结果与分析当我们运行 BankTest 后会看到类似如下的输出:用户1 取出200元剩余余额800.0用户2 取出200元剩余余额600.0用户1 取出200元剩余余额400.0用户2 取出200元剩余余额200.0用户1 取出200元剩余余额0.0用户2 取钱失败余额不足用户1 取钱失败余额不足用户2 取钱失败余额不足…可以看到余额从1000元依次递减最终正常耗尽没有出现“超扣”或“重复扣”的情况——这就是线程安全的体现。五、总结线程安全问题的本质是多线程对共享资源的并发操作导致数据不一致。在银行取钱场景中我们通过 synchronized 同步代码块给共享资源账户余额的操作加上“保护锁”从而保证了并发环境下的数据一致性。

相关新闻

华为AP刷机实战:从FIT到FAT模式切换与固件升级降级全解析

华为AP刷机实战:从FIT到FAT模式切换与固件升级降级全解析

1. 项目概述:从“砖头”到“利器”的AP重生之路 手里有一台华为的无线接入点(AP),无论是从旧项目上拆下来的,还是从二手市场淘来的,你可能会遇到各种头疼的问题:系统版本太老,新功能…

2026/8/3 22:39:46 阅读更多 →
PCB设计进阶:从基础规范到高速信号与EMC实战指南

PCB设计进阶:从基础规范到高速信号与EMC实战指南

1. PCB知识体系全景:从“画板子”到“造系统”的认知跃迁 提起PCB,很多刚入行的朋友第一反应可能就是“画板子”。在Altium Designer或者嘉立创EDA里拖拽元件、连接走线,最后导出Gerber文件发给板厂。这确实是PCB设计最直观的呈现&#xff0c…

2026/8/3 22:39:46 阅读更多 →
3分钟上手Athens知识图谱:告别碎片化知识管理,开启团队协作新时代

3分钟上手Athens知识图谱:告别碎片化知识管理,开启团队协作新时代

3分钟上手Athens知识图谱:告别碎片化知识管理,开启团队协作新时代 【免费下载链接】athens Athens is no longer maintainted. Athens was an open-source, collaborative knowledge graph, backed by YC W21 项目地址: https://gitcode.com/gh_mirror…

2026/8/3 22:38:46 阅读更多 →

最新新闻

扩散模型推理加速新范式:基于状态缓存的并行编辑技术实现900 tokens/秒

扩散模型推理加速新范式:基于状态缓存的并行编辑技术实现900 tokens/秒

1. 项目概述:当“编辑”成为性能加速器最近在模型部署和推理优化的圈子里,一个话题讨论得挺热:如何让那些动辄百亿、千亿参数的大模型,在实际应用中跑得更快、更经济?常规的思路无非是量化、剪枝、蒸馏,或者…

2026/8/3 23:09:14 阅读更多 →
扩散模型推理新范式:基于并行编辑架构实现近900 tokens/秒的生成加速

扩散模型推理新范式:基于并行编辑架构实现近900 tokens/秒的生成加速

1. 项目概述:当“编辑”成为性能加速器 最近在模型推理优化的圈子里,有个话题热度不低:一个基于“编辑”功能的小众架构,居然让一个参数量高达100B的扩散模型,跑出了接近900 tokens/秒的生成速度。这个数字是什么概念&…

2026/8/3 23:09:14 阅读更多 →
AI投入与商业回报的悖论:为何科技巨头失速而苹果崛起?

AI投入与商业回报的悖论:为何科技巨头失速而苹果崛起?

1. 一个反直觉的市场现象:当AI成为“标配”,为何巨头们反而“失速”了? 最近几个月,如果你关注美股市场,会发现一个非常有意思的现象:那些在AI领域投入重金、被市场寄予厚望的科技巨头们,股价表…

2026/8/3 23:09:14 阅读更多 →
DSL(领域特定语言)

DSL(领域特定语言)

所有表达式,本质上都是DSL(Domain-Specific Language,领域特定语言)的具体表现形式。DSL 是为解决特定领域问题而设计的“小语言”,它牺牲了通用性,换来了在某个垂直场景下的极高表达效率和易用性。对比理解…

2026/8/3 23:09:14 阅读更多 →
Deep-Live-Cam:3步实现实时AI换脸的终极指南 [特殊字符]

Deep-Live-Cam:3步实现实时AI换脸的终极指南 [特殊字符]

Deep-Live-Cam:3步实现实时AI换脸的终极指南 🎭 【免费下载链接】Deep-Live-Cam real time face swap and one-click video deepfake with only a single image 项目地址: https://gitcode.com/GitHub_Trending/de/Deep-Live-Cam 想要在视频通话中…

2026/8/3 23:08:14 阅读更多 →
Windows系统Node.js安装配置全攻略:从环境搭建到版本管理

Windows系统Node.js安装配置全攻略:从环境搭建到版本管理

1. 项目概述:为什么要在Windows上折腾Node.js? 如果你是一名前端开发者,或者对JavaScript生态圈感兴趣,那么Node.js绝对是你绕不开的核心工具。简单来说,Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#x…

2026/8/3 23:08:14 阅读更多 →

日新闻

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:47 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →