簡體   English   中英

同步塊中的同步類變量

[英]synchronized class variable within synchronized block

我正在看一些包含同步塊的api代碼,在此塊中有一個帶有默認hashmap對象的同步Map;

這是正確的方法嗎?

為什么映射與默認的哈希圖同步,並且該類變量又在同步塊中使用?

會引起內存泄漏嗎?

public class Foo
{
  static Map synchronizedMap = Collections.synchronizedMap(new HashMap());

  public static String insertValue(String value)
   {
    String key = getKey(value);
        if(!synchronizedMap.containsKey(key))
        {
           synchronized (Foo.class) {
              synchronizedMap.put(key,"somevalue");
            }
         }
        return key; 
    }


   private static String getKey(String value)
   {
     return value+"::"+"1234";
   }

  public static boolean deleteValue(String value)
   {
       String key = getKey(value);
        Object obj = null;
       synchronized (Foo.class) {
        obj = synchronizedMap.remove(key);
    }
    if(obj == null)
           return false;
      return true;
   }
}

哈希圖的同步顯得微不足道。 由於同步塊是類級別的鎖,並且映射僅是類級別的對象,因此由同步鎖提供的鎖定就足夠了。 是的,可以通過替換同步塊和同步哈希圖並使用並發哈希圖來改善這一點。

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html

您的代碼不是線程安全的:

insertValue檢查在同步塊外部是否存在值,但在內部則不再存在。 因此,另一個線程可以同時放入另一個值,然后該值將被那些線程之一覆蓋。

通常, ConcurrentHashMap遠遠優於您的實現,應該使用它。 它會瑣碎您的方法:

public static String insertValue(String value) {
  final String key = getKey(value);
  map.putIfAbsent(key , "somevalue");
  return key;
}

public static boolean deleteValue(String value) {
  final String key = getKey(value);
  return (map.remove(key) != null);
}

暫無
暫無

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

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