死锁---转账问题

本文探讨了在并发转账场景中可能出现的死锁问题,分析了死锁产生的四个必要条件,并提出了解决死锁的策略。通过破坏"占有且等待"、"不可抢占"和"循环等待"条件,可以有效地避免死锁。具体措施包括一次性申请所有资源、使用Lock实现资源抢占以及设定加锁顺序,如依据对象的hashCode确定加锁顺序。
摘要由CSDN通过智能技术生成

1. 转账死锁场景

场景:简单的银行转账,将资金从一个账户(fromAccount)转到另一个账户(toAccount),当并发执行的时候,可能会出现死锁的情况;

死锁的场景:多线程执行,线程1:账户A转账给账户B;线程2:账户B转账给账户A;线程1和线程2同时转账时,就可能会发生 死锁:
         线程1:new TransferAccount(fromAccount,toAccount,1)       
         线程2:new TransferAccount(toAccount,fromAccount,2) 
         如果执行顺序不恰当,那么线程1可能获得fromAccount的锁,并且等待toAccount的锁;然而此时线程2拥有toAccount的锁,并正在等待fromAccount的锁。

死锁是指一组互相竞争资源的线程因互相等待,导致永久阻塞的现象

/*
* 需求:简单的银行转账,它将资金从一个账户转到另一个账户
* 在开始转账之前,需要获得两个Account的锁,以确保以原子的方式更新账户中的余额,且不能破坏不可变的条件,如账户的余额不能为负数
* 
*/

/*账户类*/
class Account{
    private String accountName;//账号
    private int balance;//资金总额
    public Account(String accountName,int balance){
        this.accountName = accoun
  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值