真的是和HashMap较上劲了,之前说jdk1.8之前,HashMap在多线程下可能会造成链表环问题,所以是线程不安全的,那么在1.8之后,链表改为了尾插法,并引入红黑树时候,是不是就线程安全了呢,不是的。
参考资料如下:
简单来说,就是判定当前链表个数的时候,采用了 ++size
的操作(因为节点个数大于8需要转换为红黑树),而这个操作本身就不是线程安全的,所以说问题依然存在。
因此多线程下还是老老实实使用ConcurentHashMap吧。
HashTable是简单粗暴的将所有的操作加锁来实现线程安全的,性能非常差。
ConcurentHashMap则是通过分段hash,只锁住需要操作的散列表段,具体参考下面这篇文章。