Skip to content

目的

管程模式用于创建线程安全的对象,并防止并发应用程序中的线程发生冲突。

解释

通俗的说:

管程模式用于强制对数据进行单线程访问。每次只有一个线程被允许执行监视器对象内的代码。

维基百科上说:

在并发程序设计(也称为并行编程)中,管程是一种同步构造,它允许线程同时具有互斥和等待(阻塞)某个条件变为假的能力。管程还有一种机制,它可以向其他线程发出信号,表明它们的条件已经被满足。

程序示例

考虑这样的情形:有一家银行通过一个transfer方法将资金从一个账户转移到另一个账户。这个方法是同步的,这意味着只有一个线程可以访问此方法,因为如果多个线程访问它,余额就会在转账的同时被改变!

class Bank {

     private int[] accounts;
     Logger logger;
 
     public Bank(int accountNum, int baseAmount, Logger logger) {
         this.logger = logger;
         accounts = new int[accountNum];
         Arrays.fill(accounts, baseAmount);
     }
 
     public synchronized void transfer(int accountA, int accountB, int amount) {
         if (accounts[accountA] >= amount) {
             accounts[accountB] += amount;
             accounts[accountA] -= amount;
             logger.info("Transferred from account :" + accountA + " to account :" + accountB + " , amount :" + amount + " . balance :" + getBalance());
         }
     }

getBalance方法总是返回总金额,而每次转账后总金额都相同

     private synchronized int getBalance() {
         int balance = 0;
         for (int account : accounts) {
             balance += account;
         }
         return balance;
     }
 }

类图

alt text

适用性

在以下情形使用管程模式:

  • 有一个共享资源并且有临界区的时候
  • 你想创建线程安全的对象时
  • 你想在高级编程语言中实现互斥时