当前位置:网站首页>死锁的理解
死锁的理解
2022-07-30 09:29:00 【@Luna】
银行转账的死锁问题
一、概述
1、银行转账问题(A给B转账1000元,涉及两个用户的现金余额的事务)
转账业务是一种事务,所以需要保证数据的安全性。注意是一个原子操作。
(1)如果A用户余额小于要转出余额,则无法扣除转出人的余额。
(2)如果A用户余额小于要转出余额,则无法扣除转出人的余额,停止转账提醒转出人转账失败。
(3)在转账中途如果出现错误(A账户转出扣除成功,B账户增加失败/A给B转账同时B给A转账,获取锁的顺序相反导致死锁),需要将数据进行回滚。
2、对于一个转账操作,需要2把锁,一个锁锁住转出账户的余额,一把锁锁住转入账户的余额。但加锁的先后顺序会使程序产生死锁。
3、死锁出现的情况:A给B转账100(t1线程执行A给B转账时,获取A账户锁成功+休眠+等待获取B账户锁),同时B也给A转账100(t2线程执行B给A转账时,获取B账户锁成功+也等待获取A账户锁)造成死锁
二、死锁的四个要素
1、互斥,共享资源X和Y只能被一个线程占用;
2、占有且等待,线程T1已经获得共享资源X,在等待共享资源Y的时候,不释放共享资源X;
3、不可抢占,其他线程不能强行抢占线程T1占有的资源;
4、循环等待,线程T1等待线程T2占有的资源,线程T2等待线程T1占有的资源,就是循环等待;
三、银行转账代码:
会产生死锁版代码:



能避免死锁版代码:
原来的规则:
先获取转出人的锁,再获取收款人的锁,这就会造成两个转出人都在等待对方释放锁的情况。
更改后的规则:
所有的交易都先获取更小的锁,获取到了小的锁才能获取大锁,这就避免了环形的死锁,假如说这两个锁的大小一样,这时候就需要一把额外的锁来进行交易流程的控制。
我理解的原理:
1、因为二者同时转账,两个对象是equals相等的,所以hashcode值小的一方是固定的,采用每次先锁值小的,可以保证每个线程是顺序加锁从而避开死锁。
2、即使出现hashcode二者相等的情况,可以通过先争夺第三把锁来保证有一个人先完整完成业务释放锁,就不会出现一开始各自占有一把锁等待对象释放卡住的局面。




边栏推荐
- leetcode 剑指 Offer 46. 把数字翻译成字符串
- 九九乘法表
- 国外资源加速下载器,代码全部开源
- Version management of public Jar packages
- Paper reading: SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers
- New in GNOME: Warn users when Secure Boot is disabled
- 梅科尔工作室-看鸿蒙设备开发实战笔记五——驱动子系统开发
- 使用 Neuron 接入 Modbus TCP 及 Modbus RTU 协议设备
- Re16:读论文 ILDC for CJPE: Indian Legal Documents Corpus for Court Judgment Prediction and Explanation
- leetcode 剑指 Offer 10- II. 青蛙跳台阶问题
猜你喜欢

(C语言)文件操作

Re15:读论文 LEVEN: A Large-Scale Chinese Legal Event Detection Dataset

论文阅读:SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers

leetcode 剑指 Offer 47. 礼物的最大价值

Re17:读论文 Challenges for Information Extraction from Dialogue in Criminal Law

Re21: Read the paper MSJudge Legal Judgment Prediction with Multi-Stage Case Representation Learning in the Real

Re21:读论文 MSJudge Legal Judgment Prediction with Multi-Stage Case Representation Learning in the Real

Quick Start Tutorial for flyway

Unified exception handling causes ResponseBodyAdvice to fail

leetcode 剑指 Offer 12. 矩阵中的路径
随机推荐
idea2021+Activiti【最完整笔记一(基础使用)】
C#中Config文件中,密码的 特殊符号的书写方法。
Basic operations of sequence table in C language
leetcode 剑指 Offer 15. 二进制中1的个数
水电表预付费系统
团队级敏捷真的没你想的那么简单
(文字)无框按钮设置
Shell系统学习之数组
BERT pre-training model series summary
学习笔记11--局部轨迹直接构造法
Jenkins 如何玩转接口自动化测试?
包、类及四大权限和static
STM32CubeMX配置生成FreeRTOS项目
新一代开源免费的终端工具,太酷了
神秘的APT攻击
元宇宙改变人类工作模式的四种方式
leetcode 剑指 Offer 10- I. 斐波那契数列
Meikle Studio-Look at the actual combat notes of Hongmeng device development six-wireless networking development
Soft Exam System Architect Concise Tutorial | Case Analysis | Requirement Analysis
(BUG记录)No module named PIL