HashTable与Collections.SynchronizedMap底层实现原理

Hashtable底层实现原理

  1. 与HashMap十分类似,在put、get、remove等方法上加了同步
    public synchronized V put(K key, V value) {}
    方法的synchronized使用this锁,把整个对象都锁了,粒度大。
  2. 计算哈希值,0x7FFFFFFF转换为二进制是1个0,31个1,返回一个符号位为0的数,即丢弃最高位,以免函数外产生影响。
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
  1. 使用volatile关键字
private transient volatile Set keySet;
private transient volatile Set> entrySet;
private transient volatile Collection values;
  1. Hashtable 的 key 和 value 都不允许为 null,Hashtable遇到 null,直接返回 NullPointerException。

Collections.SynchronizedMap底层实现原理

Collections.synchronizedMap()实现原理是Collections定义了一个SynchronizedMap的内部类,并返回这个类的实例。

public static  Map synchronizedMap(Map m) {
  return new SynchronizedMap<>(m);
}

SynchronizedMap这个类实现了Map接口,在调用方法时使用synchronized来保证线程同步,当然了实际上操作的还是我们传入的HashMap实例,简单的说就是Collections.synchronizedMap()方法帮我们在操作HashMap时自动添加了synchronized来实现线程同步,类似的其它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在构造时默认赋值为this,即所有方法都用的同一个锁,m就是我们传入的map。

你可能感兴趣的:(HashTable与Collections.SynchronizedMap底层实现原理)