其他分享
首页 > 其他分享> > 互斥锁(下):如何用一把锁保护多个资源?

互斥锁(下):如何用一把锁保护多个资源?

作者:互联网

1)当我们要保护多个资源时,首先要做的是什么?

2)应该怎样保护没有关联关系的多个资源?

3)保护没有关联关系的多个资源实例?

 ​
 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() {
     synchronized(balLock) {
       return balance;
    }
  }
 ​
   // 更改密码
   void updatePassword(String pw){
     synchronized(pwLock) {
       this.password = pw;
    }
  }
   // 查看密码
   String getPassword() {
     synchronized(pwLock) {
       return password;
    }
  }
 }

3.1)上面的代码中我们可以用一把锁来保护密码和余额这两个资源吗?

3.2)用一把锁管密码和余额会存在什么问题?

3.3)那使用两把锁的优点是什么?

3.4)这种进行精细化管理的锁叫什么名字?

4)应该怎样保护有关联关系的多个资源?

 ​
 class Account {
   private int balance;
   // 转账
   void transfer(
       Account target, int amt){
     if (this.balance > amt) {
       this.balance -= amt;
       target.balance += amt;
    }
  }
 }

4.1)怎么保证转账操作 transfer() 没有并发问题呢?用 synchronized 关键字修饰一下 transfer() 方法就可以了吗?

 ​
 class Account {
   private int balance;
   // 转账
   synchronized void transfer(
       Account target, int amt){
     if (this.balance > amt) {
       this.balance -= amt;
       target.balance += amt;
    }
  }
 }

两个资源,一把this锁,这看上去完全正确的啊,有什么问题?

4.2)上面代码中的问题出现在哪里?

4.3)上面tihs锁模型图是怎样的?

 

 

4.4)this只能保护自己,不能保护他人的实例?

A、B、C 三个账户,余额都是 200 元。

两个线程分别执行两个转账操作

期望的结果A 是 100 元, B 是 200 元, C 是 300 元。

假设线程 1 执行账户 A 转账户 B 的操作,线程 2 执行账户 B 转账户 C 的操作。

4.4.1)这两个线程分别在两颗 CPU 上同时执行,那它们是互斥的吗?

4.4.2)当两个线程执行完成后,B可能的值有哪些?

 

 

4.5)那么该怎样正确的去使用一把锁避免两个关联资源没有保护周全的情况?

在上面的例子中,this 是对象级别的锁,所以 A 对象和 B 对象都有自己的锁。

4.6)如何让 A 对象和 B 对象共享一把锁呢?

5)在第一个示例程序里,我们用了两把不同的锁来分别保护账户余额、账户密码,创建锁的时候,我们用的是:private final Object xxxLock = new Object();,如果账户余额用 this.balance 作为互斥锁,账户密码用 this.password 作为互斥锁,你觉得是否可以呢?

标签:Account,多个,账户,一把,private,互斥,线程,balance,amt
来源: https://www.cnblogs.com/YXBLOGXYY/p/15966687.html