hashmap
底层:数组+链表,允许key中有一个为null,允许value中有一个或多个为null,线程不安全。
size:初始size=16,扩容之后*2,size一定是2的幂数。
hashtable
底层:数组+链表,不允许key中有null值,允许value中有一个或多个null,线程安全。
线程安全:实现线程安全是锁住整个hashtable,所以效率会很低。
锁机制:锁住整个hash表
concurrenthashmap
底层:分段数组+链表,线程安全
线程安全:实现线程安全是通过锁分离技术,将整个map分为N个Segment,并实现相同的线程安全,相比于hashtable,效率提升默认16倍。对于读操作来说,hashentry的value是volatile的,确保读到的value是最新的值。而有一些方法时需要跨段的,这时需要锁定整个表,此时的是现实按顺序依次锁定所有段,然后再按顺序依次释放所有段。
锁机制:首先将数据分成一段一段,然后分段加锁,当A线程占用了一个锁去访问一段数据时,其他段的数据可以被B、C线程访问。concurrenthashmap默认将hash表分成16个桶,如put、get、remove只是锁住需要占用的桶,即:可以有16个线程同时执行写操作。