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是线程安全的。



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