A*******e 发帖数: 2419 | 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);
}
} |
A*******e 发帖数: 2419 | 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)
|
g*****g 发帖数: 34805 | 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)
|
T*********g 发帖数: 496 | 4 dequeue那个时候还没拿到lock 继续 wait 直到enqueue方法做完
【在 A*******e 的大作中提到】 : 这里看来的。 : http://examples.javacodegeeks.com/core-java/util/concurrent/sch
|
m*****k 发帖数: 731 | 5 dequeue那个时候可能已被唤醒,但拿不到lock, 因为synchronized enqueue方法还没
退出 |
A*******e 发帖数: 2419 | 6 明白了。Java有很多要学习啊。还是得看书。
【在 m*****k 的大作中提到】 : dequeue那个时候可能已被唤醒,但拿不到lock, 因为synchronized enqueue方法还没 : 退出
|
r****c 发帖数: 2585 | |
r****c 发帖数: 2585 | 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)
|
D**C 发帖数: 6754 | 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)
|
m*****k 发帖数: 731 | 10 you forgot 'this' ?
【在 D**C 的大作中提到】 : wait 和 notify 都是要基于一个object的,这code根本就不会compile吧
|
r****c 发帖数: 2585 | 11 呵呵
应该是每看清楚method synchronization
【在 m*****k 的大作中提到】 : you forgot 'this' ?
|