java并发编程系列——死锁的解决

本文探讨了Java并发编程中的死锁问题,通过一个转账案例分析了死锁产生的原因和条件,并提出了解决死锁的两种方法:调整获取锁的顺序以及设置超时放弃。同时,强调在实际开发中,通常会使用数据库事务和乐观锁来解决此类问题。
摘要由CSDN通过智能技术生成

接下来我会以一个经典的转帐问题,跟大家一起聊聊死锁,以及如何解决这个问题。

假如客户 A 需要给客户 B 转账,客户 A 的账户减少 100 元,客户 B 的账户增加 100 元。

我们转化为代码描述:有一个账户类 Account,账户类有一个转账方法 transfer() 方法,该方法接收两个参数,转入账户和转账金额。

示例:1
public class Account {
    private int balance;

    public void transfer(Account target,int amt) {
        this.balance -= amt;
        target.balance += amt;
    }

}

实例 1 中有一个成员变量 balance,如何保证该成员变量在并发情况下没有线程安全性问题呢?我相信经过你的思考你会对代码做如下改进:

示例:2
public class Account {
    private int balance;

    public synchronized void transfer(Account target,int amt) {
        this.balance -= amt;
        target.balance += amt;
    }

}

那么加上 Synchronized 的方法有啥问题呢?我们在前面已经学习过了这种非静态方法,默认的锁是 this 也就是当前对象,但是如果我们仔细观察这段代码我们就会发现问题出在哪,代码区有两个资源,一个 this 表示转出账户,targ

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值