前言
在上篇中提到,受保护资源和锁之间合理的关联关系应该是N:1的关系,也就是说一把锁可以用来保护多个资源,但是不能用多把锁来保护一个资源。
当我们要保护多个资源时,首先要区分这些资源是否存在关联关系。
保护没有关联关系的多个资源
例如:账户中转账操作、修改密码操作,可以通过分配不同的锁来解决并发问题。
class Account {
// 锁:保护账户余额
private final Object balLock = new Object();
// 账户余额
private Integer balance;
// 锁:保护账户密码
private final Object pwLock
= new Object();
// 账户密码
private String password;
// 取款
void withdraw(Integer amt) {
synchronized(balLock) {
if (this.balance > amt){
this.balance -= amt;
}
}
}
// 查看余额
Integer getBalance