转载请注明出处:http://blog.csdn.net/xingjiarong/article/details/47417383
在上一篇博客中,我们学会了用ReentrantLock来控制线程访问同一个数据,防止出现Race Condition。这一次呢,我们继续深入的学习,学习一下java中的条件对象,条件对象在多线程同步中用到的比较多。
首先,我们来介绍一下临界区。
临界区:在同步的程序设计中,临界区指的是一个访问共用资源的程序片段,而这些共用资源又具有无法同时被多个线程访问的特性。 当有线程进入临界区时,其他线程或是进程必须等待,在一些情况下必须在临界区的进入点与离开点采用一些特殊的方法,以确保这些共用资源是被互斥使用的。
现在我们来看一个新的例子,这是一个银行转账的例子。在Bank类中,我们声明了一个10个大小的数组,用来表示银行中的10个账户,而对应的数值就是这个账户中对应的金额。Bank类提供了转移账户资金的方法,可以从from账户,转移amount的资金到to账户。还提供了获得这些账户的总金额的方法,getTotalBalabce(),因为资金转移是发生在这10个账户中的,所以无论怎样转移,总的金额应该是不变的。
Bank.java
import java.util.concurrent.locks.ReentrantLock;
public class Bank {
/**
* 利用数组模拟银行账户
*/
private final double accounts[];
private ReentrantLock lock = new ReentrantLock();
public Bank() {
accounts = new double[10];
/*
* 初始化,使每个账户都初始有initialBalance金钱
*/
for (int i = 0; i < 10; i++)
accounts[i] = 1000;
}
/**
* 资金转移的方法
*
* @param from
* 源账户
* @param to
* 目标账户
* @param amount
* 转移金额
*/
public void transfer(int from, int to, double amount) {
lock.lock();
try {
if (accounts[from] < amount)