java 多线程(三)条件对象

本文介绍了Java中的条件对象Condition,通过银行转账的例子展示了如何配合ReentrantLock控制线程同步。当账户资金不足时,线程会通过await()方法释放锁并等待,直到其他线程调用signalAll()唤醒。文章强调了在使用await()时需在while循环中判断条件,以避免错误的执行。此外,还提到了signal()方法与signalAll()的区别。
摘要由CSDN通过智能技术生成

转载请注明出处: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)
                
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值