我想以線程安全的方式存儲對象列表,同時保持優先級。本來我開始使用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