[英]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.