【发布时间】:2018-12-14 07:26:07
【问题描述】:
我正在尝试使用ReentrantLock 来实现消费者-生产者,如下所示:
class Producer implements Runnable {
private List<String> data;
private ReentrantLock lock;
Producer(List<String> data,ReentrantLock lock)
{
this.data = data;
this.lock = lock;
}
@Override
public void run() {
int counter = 0;
synchronized (lock)
{
while (true)
{
if ( data.size() < 5)
{
counter++;
data.add("writing:: "+counter);
}
else
{
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
class Consumer implements Runnable{
private List<String> data;
private ReentrantLock lock;
Consumer(List<String> data,ReentrantLock lock)
{
this.data = data;
this.lock = lock;
}
@Override
public void run() {
int counter = 0;
synchronized (lock)
{
while (true)
{
if ( data.size() > 0)
{
System.out.println("reading:: "+data.get(data.size()-1));
data.remove(data.size()-1);
}
else
{
System.out.println("Notifying..");
lock.notify();
}
}
}
}
}
public class ProducerConsumer {
public static void main(String[] args) {
List<String> str = new LinkedList<>();
ReentrantLock lock= new ReentrantLock();
Thread t1 = new Thread(new Producer(str,lock));
Thread t2 = new Thread(new Consumer(str,lock));
t1.start();
t2.start();
}
}
因此,它只向列表写入一次,然后消费者无限期地等待。为什么会这样?为什么 Producer 不获取锁?
【问题讨论】:
-
你读过这方面的教程吗?例如,docs.oracle.com/javase/tutorial/essential/concurrency/…
-
阅读链接后,我想我应该尝试使用 try
{lock.lock()}最后{lock.unlock()}相同吗?但是,我对使用它有点困惑。
标签: java multithreading locking producer-consumer reentrantlock