Hashtable底层实现原理
- 与HashMap十分类似,在put、get、remove等方法上加了同步。
public synchronized V put(K key, V value) {}
方法的synchronized使用this锁,把整个对象都锁了,粒度大。 - 计算哈希值,0x7FFFFFFF转换为二进制是1个0,31个1,返回一个符号位为0的数,即丢弃最高位,以免函数外产生影响。
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
- 使用volatile关键字
private transient volatile Set<K> keySet;
private transient volatile Set<Map.Entry<K,V>> entrySet;
private transient volatile Collection<V> values;
- Hashtable 的 key 和 value 都不允许为 null,Hashtable遇到 null,直接返回 NullPointerException。
Collections.SynchronizedMap底层实现原理
Collections.synchronizedMap()实现原理是Collections定义了一个SynchronizedMap的内部类,并返回这个类的实例。
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> 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。
网友评论