目录
71.ConcurrentHashMap JDK1.7说说其put的机制?
72.ConcurrentHashMap JDK1.7是如何扩容的?
73.ConcurrentHashMap JDK1.8实现的原理是什么?
74.ConcurrentHashMap JDK1.8是如何扩容的?
75.ConcurrentHashMap JDK1.8链表转红黑树的时机是什么?临界值为什么是8?
76.ConcurrentHashMap JDK1.8时如何进行数据迁移的?
77.先说说并发集合中Fail-fast机制?
78.CopyOnWriteArrayList实现原理?
79.弱一致性的迭代器原理是怎么样的?
80.CopyOnWriteArrayList为什么并发安全性能比Vector好?
71.ConcurrentHashMap JDK1.7说说其put的机制?
1.计算key的hash值
2.根据hash值找到Segment数组中的位置j;ensureSegment(j)对Segment[j]进行初始化(Segment内部是由数组+链表组成的)
3.插入新值到槽s中
72.ConcurrentHashMap JDK1.7是如何扩容的?
rehash(注:Segment数组不能扩容,扩容Segment数组某个位置内部的数组HashEnert<K,V>[]进行扩容)
73.ConcurrentHashMap JDK1.8实现的原理是什么?
在JDK1.7之前,ConcurrentHashMap是通过分段锁机制实现的,所以其最大并发度受Segment的个数限制。因此,在JDK1.8中,ConcurrentHashMap的实现原理摒弃了这种设计,而是选择了与HashMap类似的数组+链表+红黑树的方式实现,而加锁则采用CAS和synchronized实现。
简言之:数组+链表+红黑树,CAS。
74.ConcurrentHashMap JDK1.8是如何扩容的?
tryPresize,扩容也是做翻倍扩容的,扩容后数组容量为原来的2倍。
75.ConcurrentHashMap JDK1.8链表转红黑树的时机是什么?临界值为什么是8?
size=8,log(N)
而树化的临界值选择8是通过泊松分布算出的,结点个数为8出现的几率是亿分之6。
76.ConcurrentHashMap JDK1.8时如何进行数据迁移的?
transfer,将原来的tab数组的元素迁移到新的nextTab数组中。
77.先说说并发集合中Fail-fast机制?
快速失败
在并发编程中,Fail-fast机制是一种处理线程安全的机制,主要用于检测并发集合中的迭代器是否安全。
Fail-fast机制的核心思想是:当多个线程同时对集合进行修改操作(例如添加、删除元素)时,迭代器会快速失败,抛出ConcurrentModificationException异常。这个机制的目的是为了防止迭代器在遍历集合的过程中,由于集合被其他线程修改而导致不可预知的行为。
Fail-fast机制的实现原理通常是在迭代器创建时,对集合进行一次快照操作,然后在这个快照上生成迭代器。在迭代过程中,如果集合被其他线程修改,由于快照和当前集合的不一致性,迭代器会立即失败,抛出异常。
Fail-fast机制是一种相对简单且有效的线程安全保障方式,但也有其局限性。例如,它无法处理迭代过程中元素自然增删的情况,因为这种情况并不会触发ConcurrentModificationException异常。此外,由于Fail-fast机制使用快照技术,所以可能会浪费一些系统资源。
在实际应用中,除了Fail-fast机制外,还有其他一些线程安全保障方式,如使用同步块、并发包(如java.util.concurrent包中的集合类)等。开发者可以根据具体需求选择合适的线程安全保障方式。
78.CopyOnWriteArrayList实现原理?
属性中有一个可重入锁,用来保证线程安全访问,还有一个Object类型的数组,用来存放具体的元素。当然,也使用到了反射机制和CAS来保证原子性的修改lock域。