HashTable與Collections.SynchronizedMap底層實現(xiàn)原理

Hashtable底層實現(xiàn)原理

  1. 與HashMap十分類似,在put、get、remove等方法上加了同步
    public synchronized V put(K key, V value) {}
    方法的synchronized使用this鎖,把整個對象都鎖了,粒度大。
  2. 計算哈希值,0x7FFFFFFF轉(zhuǎn)換為二進(jìn)制是1個0,31個1,返回一個符號位為0的數(shù),即丟棄最高位,以免函數(shù)外產(chǎn)生影響。
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
  1. 使用volatile關(guān)鍵字
private transient volatile Set<K> keySet;
private transient volatile Set<Map.Entry<K,V>> entrySet;
private transient volatile Collection<V> values;
  1. 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。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容