Java并发编程之美 134 页中生产者和消费者示例缺少 while
循环无法体现 Condition
特性
正确内容
下方仅演示生产者内容
Thread producer = new Thread(new Runnable() {
@Override
public void run() {
lock.lock();
try {
while (true) {
// 如果队列满了,则等待
while (queue.size() == queueSize) {
notEmpty.await();
}
// 添加元素
queue.add("ele");
// 唤醒消费线程
notFull.signalAll();
}
}catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
});
其他读者勘误
http://www.broadview.com.cn/book/5865
Thread producer = new Thread(new Runnable() {
@Override
public void run() {
// while(true)
while(true) {
// 获取独占锁
lock.lock();
try {
// 如果队列满了,则等待
while (queue.size() == queueSize) {
notEmpty.await();
}
// 添加元素
queue.add("ele");
// 唤醒消费线程
notFull.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
});
上方代码不够严谨,生产环境中使用 ReentrantLock
在外部 while
循环会导致锁重入次数过多。
网友评论