Mis*_*ith 5 java concurrency producer-consumer java-me
我正在尝试在Java ME中实现一个简单的阻塞队列.在JavaME API中,Java SE的并发实用程序不可用,因此我必须像以前一样使用wait-notify.
这是我的临时实施.我正在使用notify
而不是notifyAll
因为在我的项目中有多个生产者,但只有一个消费者.我故意使用一个对象进行wait-notify来提高可读性,尽管它浪费了一个引用:
import java.util.Vector;
public class BlockingQueue {
private Vector queue = new Vector();
private Object queueLock = new Object();
public void put(Object o){
synchronized(queueLock){
queue.addElement(o);
queueLock.notify();
}
}
public Object take(){
Object ret = null;
synchronized (queueLock) {
while (queue.isEmpty()){
try {
queueLock.wait();
} catch (InterruptedException e) {}
}
ret = queue.elementAt(0);
queue.removeElementAt(0);
}
return ret;
}
}
Run Code Online (Sandbox Code Playgroud)
我的主要问题是关于put
方法.我可以把queue.addElement
线放出synchronized
块吗?如果是这样,性能会改善吗
此外,同样适用于take
:我可以采取两种操作queue
出来的synchronized block
?
任何其他可能的优化?
编辑:
正如@Raam正确指出的那样,消费者线程在被唤醒时可能会饿死wait
.那么有什么方法可以防止这种情况呢?(注意:在JavaME中,我没有来自Java SE的所有这些好类.把它想象成旧的Java v1.2)
Vector 类不保证线程安全,您应该同步对其的访问,就像您所做的那样。除非您有证据表明您当前的解决方案存在性能问题,否则我不会担心。
顺便说一句,我认为使用notifyAll
而不是notify
支持多个消费者并没有什么坏处。