Hashtable如何保证线程安全

Hashtable如何保证线程安全

  • 前言
  • Hashtable中的常用变量
  • Hashtable中的常用方法
    • 构造方法
    • contains()
    • rehash()
    • addEntry()
    • put()
    • 其他方法
  • Hashtable与HashMap的区别

前言

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.传入初始容量和负载因子
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<?,?

你可能感兴趣的:(数据结构,java,线程安全,hashtable)