簡體   English   中英

Java(Android),沒有鎖定的線程安全FIFO?

[英]Java (Android), thread safe FIFO without locking?

我有一個生產者-消費者情況,正好有兩個線程。 一個從池中取出對象,然后將它們放入fifo,另一個從中讀取對象(一次多個),進行計算,從列表中刪除它們,然后將它們放回池中。
使用ConcurrentLinkedQueue時,該模式應該是線程安全的,沒有其他鎖定。 每個對象僅寫入一次,讀取一次並刪除一次。 Add()和Poll()在CLQ中是安全的。
a)這是正確的嗎?
b)還有哪些其他容器支持此特定模式? 我記得關於LinkedList甚至ArrayList的事情是安全的,因為“ getSize()”或“ head = ...”具有一些原子效應,但我不確定並且找不到它。

  1. 是的, ConcurrentLinkedQueue addpoll方法是線程安全的(與所有其他方法一樣)。
  2. 不, 使用ArrayListLinkedList在並發環境直接。 根據定義,這些類不是線程安全的:

請注意,此實現未同步。 如果多個線程同時訪問ArrayList實例,並且至少有一個線程在結構上修改列表,則必須在外部進行同步。

如果您對ConcurrentLinkedQueue不滿意,請查看包java.util.concurrent所有那些容器實現:

  • ConcurrentLinkedDeque (是一個Queue
  • LinkedBlockingQueue (是BlockingQueue
  • LinkedBlockingDeque (是BlockingDeque
  • ArrayBlockingQueue (是一個BlockingQueue

我假設QueueBlockingQueue是您選擇的接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM