Redian新闻
>
这个Java blocking queue实现是不是有问题?
avatar
这个Java blocking queue实现是不是有问题?# JobHunting - 待字闺中
A*e
1
假设空队列时,先有dequeue执行,发现队列为空,等待。
这时来一个enqueue,调用notifyAll()之后,插入新对象之前,dequeue已经唤醒,试
图去删除,这时队列仍然可能是空啊。
public class BlockingQueue {
private List queue = new LinkedList();
private int limit = 10;
public BlockingQueue(int limit){
this.limit = limit;
}
public synchronized void enqueue(Object item)
throws InterruptedException {
while(this.queue.size() == this.limit) {
wait();
}
if(this.queue.size() == 0) {
notifyAll();
}
this.queue.add(item);
}
public synchronized Object dequeue()
throws InterruptedException{
while(this.queue.size() == 0){
wait();
}
if(this.queue.size() == this.limit){
notifyAll();
}
return this.queue.remove(0);
}
}
avatar
A*e
2
这里看来的。
http://examples.javacodegeeks.com/core-java/util/concurrent/sch

【在 A*******e 的大作中提到】
: 假设空队列时,先有dequeue执行,发现队列为空,等待。
: 这时来一个enqueue,调用notifyAll()之后,插入新对象之前,dequeue已经唤醒,试
: 图去删除,这时队列仍然可能是空啊。
: public class BlockingQueue {
: private List queue = new LinkedList();
: private int limit = 10;
: public BlockingQueue(int limit){
: this.limit = limit;
: }
: public synchronized void enqueue(Object item)

avatar
g*g
3
这年头没人用wait/notify了吧。你真要写也从ReentrantLock开始。

【在 A*******e 的大作中提到】
: 假设空队列时,先有dequeue执行,发现队列为空,等待。
: 这时来一个enqueue,调用notifyAll()之后,插入新对象之前,dequeue已经唤醒,试
: 图去删除,这时队列仍然可能是空啊。
: public class BlockingQueue {
: private List queue = new LinkedList();
: private int limit = 10;
: public BlockingQueue(int limit){
: this.limit = limit;
: }
: public synchronized void enqueue(Object item)

avatar
m*k
5
dequeue那个时候可能已被唤醒,但拿不到lock, 因为synchronized enqueue方法还没
退出
avatar
A*e
6
明白了。Java有很多要学习啊。还是得看书。

【在 m*****k 的大作中提到】
: dequeue那个时候可能已被唤醒,但拿不到lock, 因为synchronized enqueue方法还没
: 退出

avatar
r*c
8
synchronized method就已经独享了这个object lock,知道这个thread退出,其他
synchronized method不可以执行

【在 A*******e 的大作中提到】
: 假设空队列时,先有dequeue执行,发现队列为空,等待。
: 这时来一个enqueue,调用notifyAll()之后,插入新对象之前,dequeue已经唤醒,试
: 图去删除,这时队列仍然可能是空啊。
: public class BlockingQueue {
: private List queue = new LinkedList();
: private int limit = 10;
: public BlockingQueue(int limit){
: this.limit = limit;
: }
: public synchronized void enqueue(Object item)

avatar
D*C
9
wait 和 notify 都是要基于一个object的,这code根本就不会compile吧

【在 A*******e 的大作中提到】
: 假设空队列时,先有dequeue执行,发现队列为空,等待。
: 这时来一个enqueue,调用notifyAll()之后,插入新对象之前,dequeue已经唤醒,试
: 图去删除,这时队列仍然可能是空啊。
: public class BlockingQueue {
: private List queue = new LinkedList();
: private int limit = 10;
: public BlockingQueue(int limit){
: this.limit = limit;
: }
: public synchronized void enqueue(Object item)

avatar
m*k
10
you forgot 'this' ?

【在 D**C 的大作中提到】
: wait 和 notify 都是要基于一个object的,这code根本就不会compile吧
avatar
r*c
11
呵呵
应该是每看清楚method synchronization

【在 m*****k 的大作中提到】
: you forgot 'this' ?
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。