接下来我会以一个经典的转帐问题,跟大家一起聊聊死锁,以及如何解决这个问题。
假如客户 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