我試圖了解下面的內容是否是線程安全的,它是由另一位開發(fā)人員編寫的,我繼承了該開發(fā)人員的代碼,但不再屬于我們。我有一個 BaseProvider 類,它實際上是一個消息緩存,由 LinkedBlockingQueue 表示。此類將傳入消息存儲在隊列中。我有一組讀取該隊列的工作線程。因此 LinkedBlockingQueue 是線程安全的。問題 1. 當工作線程調用provider.getNextQueuedItem()時,提供者逐項遍歷并將其添加到列表中并返回消息列表。在執(zhí)行此操作時,如果通過調用 addToQueue 將消息添加到提供者類中,會發(fā)生什么情況?LinkedBlockingQueue 內部的 takeLock 是否會阻止向隊列添加新消息,直到所有消息都從隊列中取出?您會注意到,每個工作線程都可以訪問所有提供程序,因此當一個工作線程遍歷所有提供程序并調用 getNextQueuedItem() 時,當另一個工作線程也調用所有提供程序并調用 getNextQueuedItem() 時會發(fā)生什么?兩個工作線程會互相跨過嗎?公共抽象類 BaseProvider 實現(xiàn) IProvider { private LinkedBlockingQueue<CoreMessage> internalQueue = new LinkedBlockingQueue<CoreMessage>();@Overridepublic 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); }}}
1 回答

Cats萌萌
TA貢獻1805條經(jīng)驗 獲得超9個贊
如果通過調用 addToQueue 將消息添加到提供者類中會發(fā)生什么?
getNextQueuedItem()
和addToQueue(...)
都是synchronized
方法。如果這是唯一訪問 的兩個方法private ... internalQueue
,那么多個線程就無法同時訪問internalQueue
。
當一個工作線程正在遍歷所有提供程序并調用 getNextQueuedItem() 時,當另一個工作線程也調用所有提供程序并調用 getNextQueuedItem() 時,會發(fā)生什么情況?
您是否詢問多個工作人員訪問同一提供商?這是不可能發(fā)生的,因為getNextQueuedItem()
這是一種synchronized
方法。
- 或者 -
您是否詢問不同的工作人員訪問不同的提供商?這應該不重要(至少,就類而言BaseProvider
),因為似乎沒有任何方式可以將不同的對象相互連接起來。
添加回答
舉報
0/150
提交
取消