应该signal()方法总是在lock()和unlock()之间?

时间:2014-09-22 14:55:12

标签: java methods signals

signal()await()signalAll()的来电是否始终需要介于lock()unlock()之间?

示例:

import java.util.Scanner;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.Condition;

class A{
    int num=0;
    boolean onoff=false;
    private final ReentrantLock key=new ReentrantLock();
    private final Condition setCondi=key.newCondition();

    void input(int i){

        key.lock();
        try{

            if(onoff==true)
                setCondi.await();

            num=i;       
            onoff=true; 
            setCondi.signal();      

        }
        catch(InterruptedException e){
            e.printStackTrace();
        }
        finally{
            key.unlock();
        }
            num=i;       
            onoff=true; 
            setCondi.signal();  

1 个答案:

答案 0 :(得分:2)

The Javadoc has the answer

  

当此方法执行时(并且通常会)要求当前线程保持与此Condition关联的锁定   被称为。实现必须记录此前提条件和任何前提条件   如果没有锁定则采取的行动。 通常,例外情况   因为IllegalMonitorStateException将被抛出。

所以,是的,在典型的实现中,必须在持有signal()的同时完成对Condition(和其他Lock方法)的调用。