如何通知在其他监视器上等待的所有线程?

时间:2014-06-08 15:49:41

标签: java multithreading concurrency monitor

我们假设您有一个银行帐户。你有两个同步的方法

public synchronized void withdraw ( int amount, String name ) {
    while ( account_balance < amount ) {
        try {
            wait();
        } catch (InterruptedException e) {
    }

}

public synchronized void deposit ( int amount, String name ) {
     while ( account_balance > 3*amount ) {
        try {
            wait();
        } catch (InterruptedException e) {
        }
    }

}

在撤销监视器中等待的线程正在等待另一个线程存入一些钱,以便他们可以撤回,反之亦然。因此,如果一个线程提取资金,通知撤销监视器中的所有线程是没有意义的,通知在存款监视器中等待的线程是有意义的,因为账户余额是&#34;完全&#34;反之亦然。既然你不能指定哪个线程通过notify()唤醒,而notifyAll()通知在当前监视器中等待的线程如何通知在其他监视器上等待的线程?

2 个答案:

答案 0 :(得分:1)

如何使用java.util.concurrent.locks.ReentrantLock而不是使用语言的内置显示器?

class Account {
    private final Lock lock = new ReentrantLock();
    private final Condition depositOk = lock.newCondition();
    private final Condition withdrawOk = lock.newCondition();

    public void withdraw(amount) {
        lock.lock();
        try {
            while (!accountContainsAtLeast(amount)) {
                withdrawOk.await();
            }
            withdrawLocked(amount);
            depositOK.signal();
        } finally {
            lock.unlock();
        }
    }

    public void deposit(amount) {
        lock.lock();
        try {
            while (!OKtoDeposit(amount)) {
                depositOk.await();
            }
            depositLocked(amount);
            withdrawOK.signal();
        } finally {
            lock.unlock();
        }
    }
}

答案 1 :(得分:0)

  

notifyAll()通知在当前监视器中等待的线程

不,它没有。它会通知您在其上调用它的监视器上等待的所有线程。这正是你想要的。