ConcurrentHashMap的两次hash有什么不同
时间: 2023-11-16 19:01:49 浏览: 28
ConcurrentHashMap相对于HashMap和Hashtable最大的不同在于,它使用了分段锁的机制,将整个Map分成了多个Segment,每个Segment默认情况下都是由一个锁来控制的。在ConcurrentHashMap中,put和get操作都需要进行两次hash操作,第一次hash到达指定的Segment,第二次hash到达Segment里面的Entry,然后在遍历Entry链表。这样做的好处是,可以减小锁的粒度,提高并发度,从而提高ConcurrentHashMap的并发性能。
相关问题
ConcurrentHashMap计算hash为什么不允许null
ConcurrentHashMap计算hash不允许null是因为在计算hash的时候,需要调用key的hashCode()方法,如果key为null,那么调用hashCode()方法就会抛出NullPointerException异常。此外,ConcurrentHashMap还需要加空值校验是因为在put操作时,如果key或value为null,ConcurrentHashMap会抛出NullPointerException异常,这是为了保证ConcurrentHashMap的数据结构的完整性和正确性。
ConcurrentHashMap 1.7和1.8实现有什么不同?
ConcurrentHashMap是Java中的一种线程安全的哈希表实现。在1.7和1.8版本中,Java对ConcurrentHashMap做了一些优化,主要包括以下几点:
1. 分段锁的优化:在1.7中,ConcurrentHashMap采用分段锁来保证线程安全;而在1.8中,ConcurrentHashMap使用了CAS操作和synchronized来实现锁的控制,提高了并发性能。
2. 数组扩容的优化:在1.7中,ConcurrentHashMap的扩容操作需要将整个哈希表锁住,这会导致其他线程无法访问,影响性能;而在1.8中,ConcurrentHashMap采用了一种新的扩容方式,只需要锁住需要扩容的部分,其他部分仍然可以并发访问。
3. Node节点的优化:在1.8中,ConcurrentHashMap使用了更加紧凑的Node节点结构,减少了内存占用。
4. 红黑树的优化:在1.8中,当链表长度超过一定阈值时,ConcurrentHashMap会将链表转化为红黑树,提高了搜索和插入的性能。
综上所述,1.8版本的ConcurrentHashMap相比于1.7版本具有更高的并发性能和更少的内存占用。