java - 条件变量的await()释放锁吗?
高洛峰
高洛峰 2017-04-18 10:48:30
0
2
1462

譬如下面的两个条件变量 isEmpty和isFull
当调用他们的await()时,lock.lock()上的锁会被释放吗?

这里有3个对象,一个i哦是lock,一个是isEmpty,一个是isFull
上锁的对象是lock,而不是isEmpty或者isFull
那isFull或者isEmpty释放的锁确实lock上的?

private volatile boolean usedData = true;//mutex for data
private final Lock lock = new ReentrantLock();
private final Condition isEmpty = lock.newCondition();
private final Condition isFull = lock.newCondition();

public void setData(int data) throws InterruptedException {
    lock.lock();
    try {
        while(!usedData) {//wait for data to be used
            isEmpty.await();
        }
        this.data = data;
        isFull.signal();//broadcast that the data is now full.
        usedData = false;//tell others I created new data.          
    }finally {
        lock.unlock();//interrupt or not, release lock
    }       
}
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

모든 응답(2)
迷茫

await 문서에는 다음 문장이 있습니다. 이 조건과 관련된 잠금은 원자적으로 해제됩니다

Ty80

감사합니다.
답변:

으아아아

await()의 기능은 다른 스레드가 경쟁 리소스에 액세스할 수 있도록 허용하는 것이므로 일시 중지 상태는 경쟁 리소스의 잠금을 해제하는 것입니다. java
SE5의 java.util.concurrent 클래스 라이브러리에서 상호 배제를 사용하고 작업을 일시 중지할 수 있는 기본 클래스는 Wait()를 통해 작업을 일시 중지할 수 있다는 의미입니다. 작업은 계속해서 실행될 수 있으며, signal()을 통해 작업을 알릴 수 있습니다.

lock()에 대한 각 호출 뒤에는 모든 상황에서 잠금이 해제될 수 있도록 try-finally 절이 와야 합니다. 작업이 wait(), signal(), signalAll()을 호출하려면 먼저 이 잠금을 소유해야 합니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿