我有一個線程,add()
s對象到LinkedList隊列中,另一個線程是poll()
是要處理對象的隊列。這些是我在隊列中使用的唯一兩種方法。我永遠不會遍歷隊列,也不會在列表中添加也不會刪除對象。我不能想到兩個線程互相踩踏並以某種方式破壞數據的場景,但也許我的想象力簡直就是缺乏。LinkedList隊列和線程安全
推送頻率很低(每秒幾次),但投票非常頻繁(每秒幾千次)。我想知道在同步add()
和poll()
時會得到多少懲罰。這是在Android上運行。我不是在尋找BlockingQueue
;我在I/O上阻塞,而不是在隊列中的對象上:
輪詢線程上的run()
方法阻止等待空間在輸出緩衝區中可用的塊。空間變得可用時,它會查看是否有任何對象在隊列中等待。如果有一個可用,則將其序列化到輸出緩衝區中。如果隊列爲空(即,poll()
返回null
),則其它較低優先級隊列,如果全部爲空,則序列化「無數據可用」消息。
不要緊的開銷是什麼?您有兩個線程競爭訪問相同資源:您**需要**同步。對於它的價值通常並不那麼糟糕。 – corsiKa
爲什麼你甚至投票呢?你能直接發送一個'消息'給另一個線程(用新的對象)嗎? Checkout Loopers和Handlers的實施細節 – smith324
感謝您提供Looper建議。我對Android特定的庫很少有經驗 - 感謝您將這一個引起我的注意。我可以看到,工作,有點。接收線程不能立即處理對象,因爲它接收到它們 - 它會阻塞IO寫入。爲了使這項工作,我需要在接收線程中的隊列的本地副本。想想吧,我不確定這是否可能 - 據我所知,Loopers阻止了他們的消息隊列,並且我需要阻止我的IO。 – iter