我试图了解下面的内容是否是线程安全的,它是由另一位开发人员编写的,我继承了该开发人员的代码,但不再属于我们。
我有一个 BaseProvider 类,它实际上是一个消息缓存,由 LinkedBlockingQueue 表示。此类将传入消息存储在队列中。
我有一组读取该队列的工作线程。因此 LinkedBlockingQueue 是线程安全的。
问题 1. 当工作线程调用provider.getNextQueuedItem()时,提供者逐项遍历并将其添加到列表中并返回消息列表。在执行此操作时,如果通过调用 addToQueue 将消息添加到提供者类中,会发生什么情况?LinkedBlockingQueue 内部的 takeLock 是否会阻止向队列添加新消息,直到所有消息都从队列中取出?
您会注意到,每个工作线程都可以访问所有提供程序,因此当一个工作线程遍历所有提供程序并调用 getNextQueuedItem() 时,当另一个工作线程也调用所有提供程序并调用 getNextQueuedItem() 时会发生什么?两个工作线程会互相跨过吗?
公共抽象类 BaseProvider 实现 IProvider {
private LinkedBlockingQueue<CoreMessage> internalQueue = new LinkedBlockingQueue<CoreMessage>();
@Override
public synchronized List<CoreMessage> getNextQueuedItem() {
List<CoreMessage> arrMessages = new ArrayList<CoreMessage>();
if (internalQueue.size() > 0) {
Logger.debug("Queue has entries");
CoreMessage msg = null;
try {
msg = internalQueue.take();
} catch (InterruptedException e) {
Logger.warn("Interruption");
e.printStackTrace();
}
if (msg != null) {
arrMessages.add(msg);
}
}
return arrMessages;
}
protected synchronized void addToQueue(CoreMessage message) {
try {
internalQueue.put(message);
} catch (InterruptedException e) {
Logger.error("Exception adding message to queue " + message);
}
}
}
Cats萌萌
相关分类