目的
管程模式用于创建线程安全的对象,并防止并发应用程序中的线程发生冲突。
解释
通俗的说:
管程模式用于强制对数据进行单线程访问。每次只有一个线程被允许执行监视器对象内的代码。
维基百科上说:
在并发程序设计(也称为并行编程)中,管程是一种同步构造,它允许线程同时具有互斥和等待(阻塞)某个条件变为假的能力。管程还有一种机制,它可以向其他线程发出信号,表明它们的条件已经被满足。
程序示例
考虑这样的情形:有一家银行通过一个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;
}
}类图

适用性
在以下情形使用管程模式:
- 有一个共享资源并且有临界区的时候
- 你想创建线程安全的对象时
- 你想在高级编程语言中实现互斥时