Map執行緒安全幾種實現方法
如果需要使 Map 執行緒安全,大致有這麼四種方法:
1、使用 synchronized 關鍵字,程式碼如下
synchronized(anObject) {
value = map.get(key);
}
2、使用 JDK1.5提供的鎖(java.util.concurrent.locks.Lock)。程式碼如下
lock.lock();
value = map.get(key);
lock.unlock();
3、使用 JDK1.5 提供的讀寫鎖(java.util.concurrent.locks.ReadWriteLock)。程式碼如下
rwlock.readLock().lock();
value = map.get(key);
rwlock.readLock().unlock();
這樣兩個讀操作可以同時進行,理論上效率會比方法 2 高。
4、使用 JDK1.5 提供的 java.util.concurrent.ConcurrentHashMap 類。該類將 Map 的儲存空間分為若干塊,每塊擁有自己的鎖,大大減少了多個執行緒爭奪同一個鎖的情況。程式碼如下
value = map.get(key); //同步機制內建在 get 方法中
比較:
1、不同步確實最快,與預期一致。
2、四種同步方式中,ConcurrentHashMap 是最快的,接近不同步的情況。
3、synchronized 關鍵字非常慢,比使用鎖慢了兩個數量級。如果需自己實現同步,則使用 JDK1.5 提供的鎖機制,避免使用 synchronized 關鍵字。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
public class MapTest
{
public static final int THREAD_COUNT
= 1 ;
public static final int MAP_SIZE
= 1000 ;
public static final
|