wait notify可以配合ReentrantLock使用吗
时间: 2024-01-12 17:43:20 浏览: 268
是的,wait()和notify()方法可以与ReentrantLock一起使用,但是需要使用Condition对象来实现。Condition是一种更加灵活的线程通信机制,它可以与Lock实现关联,可以在某个条件满足时通知等待线程。
例如,可以通过以下方式使用ReentrantLock和Condition来实现wait()和notify()的功能:
```java
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class Example {
private final ReentrantLock lock = new ReentrantLock();
private final Condition condition = lock.newCondition();
private boolean flag = false;
public void produce() throws InterruptedException {
lock.lock();
try {
// 检查标志位,如果已经为true,则等待
while (flag) {
condition.await();
}
// 生产者生产数据
// ...
flag = true;
// 通知消费者可以消费了
condition.signal();
} finally {
lock.unlock();
}
}
public void consume() throws InterruptedException {
lock.lock();
try {
// 检查标志位,如果已经为false,则等待
while (!flag) {
condition.await();
}
// 消费者消费数据
// ...
flag = false;
// 通知生产者可以生产了
condition.signal();
} finally {
lock.unlock();
}
}
}
```
在这个例子中,生产者和消费者共享一个标志位flag,当flag为false时,生产者可以生产数据,而消费者需要等待;当flag为true时,消费者可以消费数据,而生产者需要等待。当生产者生产数据后,通过调用condition.signal()方法通知消费者;当消费者消费数据后,通过调用condition.signal()方法通知生产者。注意,生产者和消费者都需要在获取锁之后才能调用wait()和notify()方法。
阅读全文