我想以线程安全的方式存储对象列表,同时保持优先级。本来我开始使用BlockingQueue,因为它是线程安全的,并且有能力维护自定义优先级。我是否需要将呼叫同步到BlockingQueue(java)?
我在想我是否需要同步我的方法?我的代码如下所示:
void addToQueue(SomeObject obj) {
... put it on my priority queue
... do some logging
}
我已经注意到的是记录正在发生失灵,从多个线程访问addToQueue时。所以我用这样的方法包装了我的方法:
void addToQueue(SomeObject obj) {
syncronized(myMutex) {
... put it on my priority queue
... do some logging
}
}
这似乎是为了保持记录的顺序。所以现在我得出结论,如果我要走这条路线,那么也许我的代码会更有效率,因为不使用BlockingQueue,而是使用Set或List并自己管理优先级。
也许我对BlockingQueue有一些误解。
在'BlockingQueue'同步的唯一的事情就是在各个方法的代码的一部分。日志记录不是“BlockingQueue”的一部分,因此不会受其执行限制。 –
这是一个对象集合吗?批量集合操作addAll,containsAll,retainAll和removeAll不一定以原子方式执行,除非在实现中另行指定。因此,例如,在添加c中的一些元素后,addAll(c)可能会失败(抛出异常)。 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html – JNL
本质上,BlockingQueue具有阻塞操作,所以要小心在同步部分内进行阻塞调用代码,否则你可能会陷入僵局。 – jekennedy