Hashtable底層實現(xiàn)原理
- 與HashMap十分類似,在put、get、remove等方法上加了同步。
public synchronized V put(K key, V value) {}
方法的synchronized使用this鎖,把整個對象都鎖了,粒度大。 - 計算哈希值,0x7FFFFFFF轉(zhuǎn)換為二進(jìn)制是1個0,31個1,返回一個符號位為0的數(shù),即丟棄最高位,以免函數(shù)外產(chǎn)生影響。
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
- 使用volatile關(guān)鍵字
private transient volatile Set<K> keySet;
private transient volatile Set<Map.Entry<K,V>> entrySet;
private transient volatile Collection<V> values;
- Hashtable 的 key 和 value 都不允許為 null,Hashtable遇到 null,直接返回 NullPointerException。
Collections.SynchronizedMap底層實現(xiàn)原理
Collections.synchronizedMap()實現(xiàn)原理是Collections定義了一個SynchronizedMap的內(nèi)部類,并返回這個類的實例。
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
return new SynchronizedMap<>(m);
}
SynchronizedMap這個類實現(xiàn)了Map接口,在調(diào)用方法時使用synchronized來保證線程同步,當(dāng)然了實際上操作的還是我們傳入的HashMap實例,簡單的說就是Collections.synchronizedMap()方法幫我們在操作HashMap時自動添加了synchronized來實現(xiàn)線程同步,類似的其它Collections.synchronizedXX方法也是類似原理)。
public V get(Object key) {
synchronized (mutex) {return m.get(key);}
}
public V put(K key,V value) {
synchronized (mutex) {return m.put(key,value);}
}
Mutex在構(gòu)造時默認(rèn)賦值為this,即所有方法都用的同一個鎖,m就是我們傳入的map。