假設線程A嘗試向ConcurrentLinkedQueue添加元素,並且同時線程B嘗試向同一個ConcurrentLinkedQueue添加不同的元素。將兩個線程中的元素同時添加到同一個ConcurrentLinkedQueue中
將這兩個項目添加到隊列中,還是我可以有併發問題(比方說,可能只有一個將被插入)?
我知道這個隊列是線程安全的,但是我不知道這是否意味着我可以認爲這個方法也是安全的,當我從不同的線程同時調用它兩次時。
如果沒有,可能方法put/offer對於這種情況是安全的嗎?
假設線程A嘗試向ConcurrentLinkedQueue添加元素,並且同時線程B嘗試向同一個ConcurrentLinkedQueue添加不同的元素。將兩個線程中的元素同時添加到同一個ConcurrentLinkedQueue中
將這兩個項目添加到隊列中,還是我可以有併發問題(比方說,可能只有一個將被插入)?
我知道這個隊列是線程安全的,但是我不知道這是否意味着我可以認爲這個方法也是安全的,當我從不同的線程同時調用它兩次時。
如果沒有,可能方法put/offer對於這種情況是安全的嗎?
您可以安全地從不同的線程向ConcurrentLinkedQueue
添加元素。所有元素都將排隊。如果你從每個線程的兩個線程調用add()
方法,你將在隊列中有兩個元素。在ConcurrentLinkedQueue
的界面中沒有方法put()
。方法add()
和offer()
一樣。你可以在源代碼中看到這個
/**
* Inserts the specified element at the tail of this queue.
* As the queue is unbounded, this method will never throw
* {@link IllegalStateException} or return {@code false}.
*
* @return {@code true} (as specified by {@link Collection#add})
* @throws NullPointerException if the specified element is null
*/
public boolean add(E e) {
return offer(e);
}
tnx。並且它計算隊列的所有添加方法? (添加和提供方法) – Rodrigo
@Rodrigo我更新我的答案 –
Concurrent類的整體思想是它們是線程安全和高效的。 – Kayaman
......並且「線程安全」類的整個想法是,無論來自不同線程的同時調用多少次,它的所有方法都能「正確地工作」。在併發程序中,「正確的東西」意味着並不總是100%明顯,但對於隊列而言,這意味着至少添加的元素不會從隊列中消失,而且永遠不會從未添加的隊列中拉出一個元素。 –