并发(11)

目录

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[]进行扩容)

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域。

并发(11)_第1张图片

79.弱一致性的迭代器原理是怎么样的?

并发(11)_第2张图片

80.CopyOnWriteArrayList为什么并发安全性能比Vector好?

并发(11)_第3张图片

你可能感兴趣的:(并发,面试题,并发)