簡體   English   中英

java.util.concurrent.ConcurrentHashMap.putIfAbsent是否需要在同步塊中?

[英]Does java.util.concurrent.ConcurrentHashMap.putIfAbsent need to be in a syncronized block?

我試圖追蹤競爭條件,所有跡象似乎都指向ConcurrentHashMap.putIfAbsent() 是否有可能如果2個線程在空映射上調用putIfAbsent()並使用相同的鍵來執行查找以查看密鑰是否存在,那么兩個線程是否都會嘗試添加它? 由於某些原因,當我第一次開始使用putIfAbsent()我認為調用不需要同步。 但是現在我看不出如果時機合適,它會如何阻止兩個線程添加它們的值。 我無法在生產之外重現這一點。

謝謝

任何並發集合的操作都不需要使用synchronized。

這是設計的,實際上鎖定集合對其他操作沒有影響。 (除非它們也被鎖定)在這種情況下它會使它們變慢。

是否有可能如果2個線程在空映射上調用putIfAbsent()並使用相同的鍵來執行查找以查看密鑰是否存在,那么兩個線程是否都會嘗試添加它?

兩者都可以嘗試,但只有一個會成功。 兩個線程似乎不可能成功。

由於某些原因,當我第一次開始使用putIfAbsent()時,我認為調用不需要同步。

它沒有。

但是現在我看不出如果時機合適,它會如何阻止兩個線程添加它們的值。

它在代碼中執行CAS操作 ,這意味着只有一個操作可以成功,並且線程將知道哪個操作。 CAS操作不需要鎖定,因為它使用底層匯編指令來執行此操作。 實際上,您通常會使用CAS操作實現鎖定,而不是相反。

是否有可能如果2個線程在一個空映射上調用putIfAbsent並使用相同的鍵,兩個都可以進行查找以查看密鑰是否存在,那么兩個線程都會嘗試添加它?

不是根據putIfAbsent()的文檔:

如果指定的鍵尚未與值關聯,請將其與給定值相關聯。 這相當於

if (!map.containsKey(key))
    return map.put(key, value);
else
    return map.get(key);

除了動作以原子方式執行

這意味着兩個線程都無法嘗試插入鍵值對。

暫無
暫無

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

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