HashMap
底层数组 链表实现,可以存储null键和null值。 HashMap是线程不安全的,在多线程环境中,需要手动实现同步机制
HashTable
底层数组 链表实现,无论key还是value都不能为null,线程安全(安全的实现原理
:修改数据时锁住整个HashTable
,效率低,ConcurrentHashMap
做了相关优化)
Hashtable是线程安全的,它的方法是同步的,可以直接用在多线程环境中
ConcurrentHashMap
从Java5开始,它是HashTable的替代,比HashTable的扩展性更好
ConcurrentHashMap
是使用了锁分段技术来保证线程安全的
ConcurrentHashMap提供了与Hashtable和SynchronizedMap不同的锁机制。Hashtable中采用的锁机制是一次锁住整个hash表,从而在同一时刻只能由一个线程对其进行操作;而ConcurrentHashMap默认将hash表分为16个桶,一次锁住一个桶.
ConcurrentHashMap比HashMap多出了一个类Segment,而Segment是一个可重入锁(可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁)
可重入锁
- synchronized
- ReentrantLock