第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

LinkedBlockingQueue 和工作線程 - 這段代碼線程安全嗎?

LinkedBlockingQueue 和工作線程 - 這段代碼線程安全嗎?

至尊寶的傳說 2023-11-10 16:24:48
我試圖了解下面的內(nèi)容是否是線程安全的,它是由另一位開發(fā)人員編寫的,我繼承了該開發(fā)人員的代碼,但不再屬于我們。我有一個(gè) BaseProvider 類,它實(shí)際上是一個(gè)消息緩存,由 LinkedBlockingQueue 表示。此類將傳入消息存儲(chǔ)在隊(duì)列中。我有一組讀取該隊(duì)列的工作線程。因此 LinkedBlockingQueue 是線程安全的。問題 1. 當(dāng)工作線程調(diào)用provider.getNextQueuedItem()時(shí),提供者逐項(xiàng)遍歷并將其添加到列表中并返回消息列表。在執(zhí)行此操作時(shí),如果通過調(diào)用 addToQueue 將消息添加到提供者類中,會(huì)發(fā)生什么情況?LinkedBlockingQueue 內(nèi)部的 takeLock 是否會(huì)阻止向隊(duì)列添加新消息,直到所有消息都從隊(duì)列中取出?您會(huì)注意到,每個(gè)工作線程都可以訪問所有提供程序,因此當(dāng)一個(gè)工作線程遍歷所有提供程序并調(diào)用 getNextQueuedItem() 時(shí),當(dāng)另一個(gè)工作線程也調(diào)用所有提供程序并調(diào)用 getNextQueuedItem() 時(shí)會(huì)發(fā)生什么?兩個(gè)工作線程會(huì)互相跨過嗎?公共抽象類 BaseProvider 實(shí)現(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貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超9個(gè)贊

如果通過調(diào)用 addToQueue 將消息添加到提供者類中會(huì)發(fā)生什么?

getNextQueuedItem()addToQueue(...)都是synchronized方法。如果這是唯一訪問 的兩個(gè)方法private ... internalQueue,那么多個(gè)線程就無法同時(shí)訪問internalQueue

當(dāng)一個(gè)工作線程正在遍歷所有提供程序并調(diào)用 getNextQueuedItem() 時(shí),當(dāng)另一個(gè)工作線程也調(diào)用所有提供程序并調(diào)用 getNextQueuedItem() 時(shí),會(huì)發(fā)生什么情況?

您是否詢問多個(gè)工作人員訪問同一提供商?這是不可能發(fā)生的,因?yàn)?code>getNextQueuedItem()這是一種synchronized方法。

- 或者 -

您是否詢問不同的工作人員訪問不同的提供商?這應(yīng)該不重要(至少,就類而言BaseProvider),因?yàn)樗坪鯖]有任何方式可以將不同的對(duì)象相互連接起來。


查看完整回答
反對(duì) 回復(fù) 2023-11-10
  • 1 回答
  • 0 關(guān)注
  • 189 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)