集合 執行緒安全的HashMap

2022-06-28 16:48:08 字數 1551 閱讀 4080

一、一般模式下執行緒安全的hashmap

預設情況常用的hashmap都是執行緒不安全的,在多執行緒的環境下使用,常常會造成不可預知的,莫名其妙的錯誤。那麼,我們如何實現乙個執行緒安全的hashmap呢?其中乙個可行的方式是使用collectons.synchronizedmap() 方法來包裝我們的hashmap。如下:

mapmap = collections.synchronizedmap(new hashmap());

collections.synchronizedmap()會生成乙個synchronizedmap,它使用委託模式,將自己hashmap相關的功能交給傳入hashmap實現,二自己負責執行緒安全的相關實現,下面看看
synchronizedmap的定義:
private

static

class synchronizedmapimplements map, serializable

如在**中看到的,所有對map的操作都需要用 這個 mutex  來同步,以實現執行緒安全。比如說下面這些常見的對hashmap的操作方法:

public

boolean

containskey(object key)

}public

boolean

containsvalue(object value)

}public

v get(object key)

}

除了以上看到的方法之外,其他的map相關的方法有類似的操作。雖然這個包裝的map可以實現執行緒安全的要求,但是,它在多執行緒環境下的效能表現並不是很好,無論是對map的讀取還是寫入,偶數需要獲得 mutex 的同步鎖,這會導致所有對map的安全操作也會進入等待狀態,知道mutex可用。 如果併發級別不高,那麼這個 包裝的map可以基本滿足要求,但是在搞併發的環境中,我們需要尋找新的解決方案。 ——---> 那就是我們的 concurrenthashmap.

二、提高"鎖"效能的策略

1. 減少鎖的持有時間

只在必要時進行同步,減少鎖的持有時間。比如說在乙個方法中只有乙個變數需要同步,那麼就沒有必要對這整個方法都進行同步,而只需要同步這個變數即可。

//

無謂的加鎖時間

public synchronied void

syncmethod()

//正確的加鎖時間

public

void

syncmethod()

othermethod();

}

2.  減小鎖的粒度

在獲取全域性資訊方法不頻繁的時候,通過減小鎖的粒度可以搞系統的吞吐量。

3. 讀寫分離鎖替換獨佔鎖

在讀都寫少的情況下,使用讀寫分離鎖,多執行緒讀時不阻塞,而只對寫執行緒進行同步。

4. 鎖分離

對不同功能的鎖進行不同的鎖策略。

5. 鎖粗化

系統對於"鎖"的排程也是需要效能消耗的,又是我們可以適當的加大鎖的範圍,比如說在迴圈中儘量減少對鎖的請求和釋放,而是在得到鎖的情況,一次性把問題解決。

集合 HashMap的不安全

1.hashmap存在的問題 public static void main string args throws interruptedexception system.out.println t1 over thread t2 new thread system.out.println t2 o...

執行緒安全的集合

集合大概有4種型別 list set queue map其中vector hashtable properties是執行緒安全的。其中arraylist linkedlist hashset treeset hashmap treemap等都是執行緒不安全的。執行緒不安全是指 當多個執行緒訪問同乙個...

執行緒安全的集合

工具類中提供了多個可以獲得執行緒安全集合的方法。synchronizedcollection collectionc synchronizedlist listlist synchronizedset sets synchronizedmap mapm synchronizedsortedset s...