簡體   English   中英

Java - if 語句是線程安全的嗎?

[英]Java - Are if-statements thread-safe?

這可能是一個愚蠢的問題,但是 .. 讓我們假設我有一個 ContainerClass 類,如果包含一個從添加和刪除元素的多個線程訪問的 HashSet.. 在其中一個線程中,我們稱之為線程 1,我執行以下代碼:

if(ContainerClass.hashSet.containsKey(keyId))
    int number = ContainerClass.hashSet.get(keyId);

是否保證到第二行執行時,keyId 為key的元素還在? 或者該線程是否可以在 if 語句中進行檢查,然后暫停,然后另一個線程更改 HashSet,並且線程 1 獲得 NullPointerException?

不,不能保證。

為了保證這一點,您必須始終同步對hashSet (大概是java.util.HashMap )的訪問,以防止另一個線程修改這些操作之間的映射。

或者,有ConcurrentMap實現,與java.util.HashMap不同,它們旨在供多個線程使用。 它們支持一組額外的操作,例如putIfAbsent()以便您可以原子地檢查和有條件地修改映射。

即使您簡化代碼以消除不必要的檢查,在沒有內存屏障的情況下跨線程共享java.util.HashMap仍然不安全。 例如,如果另一個線程可能異步修改地圖,這就是不安全的:

Integer tmp = ContainerClass.hashSet.get(keyId);
if (tmp != null) {
  int number = tmp.intValue();
}

不能保證,線程安全是指對象數據。 如果超過 1 個線程可以同時修改它,則它不是線程安全的。 如果您擔心在共享對象上執行邏輯,則必須在鎖定語句(同步)內執行邏輯。

線程安全與共享的、可變的狀態有關。

沒有人可以從您的片段中做出決定。 如果它是班級成員,您可能想要保護它。

如果它是局部變量,則它是線程安全的。

您還可以通過使用來自concurrent 包的集合來使其更安全

暫無
暫無

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

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