Hashtable的底層實現

    Hashtable是線程安全的,那麼Hashtable是如何實現線程安全的呢?有了上面的介紹,我們直接從源碼中分析其線程安全性:

public synchronized V put(K key, V value) {

// 保證value值不爲空,此處省略其代碼 ..

// 保證key是不重複的,此處省略其代碼 ..

//查過閾值則擴容,此處省略 

// Creates the new entry. 

Entry<K,V> e = tab[index]; tab[index] = new Entry<>(hash, key, value, e); count++; return null;

}

  通過源碼可以很明顯看到其put方法使用synchronized關鍵字,在線程中這是實現線程安全的一種方式,所以Hashtable是線程安全的。

  當一個線程訪問HashTable的同步方法時,其他線程如果也要訪問同步方法,會被阻塞住。舉個例子,當一個線程使用put方法時,另一個線程不但不可以使用put方法,連get方法都不可以,好霸道啊!!!so~~,效率很低,現在基本不會選擇它了。 

     Hashtable的測試案例:

     下面使用一段測試代碼驗證Hashtable的線程安全:

Hashtable<Integer, String> hashTable = new Hashtable<Integer, String>(); final Hashtable<Integer, String> hashTable_back = hashTable; 
Thread t3 = new Thread(){ 
public void run(){ 
for (int i = 0; i < 20; i++) { 
hashTable_back.put(i, String.valueOf(i)); 
} 
} 
}; 
Thread t4 = new Thread(){
 public void run(){ 
for (int i = 20; i < 40; i++) { 
hashTable_back.put(i, String.valueOf(i)); 
} 
} 
}; 
t3.start();
t4.start(); 
//放完數據後,從map中取出數據,如果map是線程安全的,那麼取出的entry應該和放進去的一一對應 
new Handler().postDelayed(
new Runnable() { 
@Override 
public void run() { 
for (int i = 0; i < 20; i++) { 
showlog(i + "=" + hashTable_back.get(i)); 
} 
} 
}, 1000);

最後得到的輸出結果是這樣的:


OK,再次說明Hashtable是線程安全的。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章