Hashtable如何保证线程安全
前言
HashMap是非同步的,没有对读写等操作进行锁保护,是线程不安全的。
Hashtable是同步的,所有的读写操作都进行了锁保护,是线程安全的。
Hashtable的底层是数组+链表实现的
Hashtable中的常用变量
private transient Entry<?,?>[] table; //底层保存节点的数组
private transient int count; //记录表中的节点数
private int threshold; //阈值,当表的节点数>=该阈值,会进行扩容
private float loadFactor; //负载因子,计算阈值用的
private transient int modCount = 0; //Hashtable在结构上被修改的次数
// 计算节点在数组的下标
int index = (hash & 0x7FFFFFFF) % tab.length;
Hashtable中的常用方法
构造方法
1.传入初始容量和负载因子
2.只传入初始容量,默认的负载因子是0.75
3.默认的初始容量是11,负载因子是0.75
contains()
用synchronized关键字保证线程安全
public synchronized boolean containsKey(Object key) {
Entry<?,?> tab[] = table; //表
int hash = key.hashCode();
//计算key在数组中的下标
int index = (hash & 0x7FFFFFFF) % tab.length;
//遍历链表
for (Entry<?,?