看完了整个 HashMap 和 ConcurrentHashMap 在 1.7 和 1.8 中不一样的实现方式相信你们对他们的理解应该会更加到位。html
其实这块也是面试的重点内容,一般的套路是:git
- 谈谈你理解的 HashMap,讲讲其中的 get put 过程.
- 1源码有.不坐过多解释:
- 存取方式 1.7 数组+链表。1.8数组+链表+红黑树。
- 1.8 作了什么优化?
- 主要作了链表遍历的优化-->改成红黑树遍历。
- concurrentHashMap 是同理: 分段锁 修改成 abs 和 syn
- 是线程安全的嘛?
- hashMap 都不是线程安全的
- concurrenthashmap是
- 不安全会致使哪些问题?
- 致使读取的数据不对撒
- 举例看文章
- 如何解决?有没有线程安全的并发容器?
- 加锁撒
- concurrenthashmap就能解决 --底层是 对segment加了分段锁 ,1.8修改成 abs和syn put值
- ConcurrentHashMap 是如何实现的? 1.七、1.8 实现有何不一样?为何这么作?
- 对数据加了volition 对全部数据在内存中都是可见的。
- 1.7是对segment实行分段所 和自旋锁--数组+链表。
- 1.8是对实行了abs和syn原子操做---数组+链表+红黑树-- 优先红黑树 。
- 链表的时间复杂度是 o(N) 红黑树是o(logN)
这一串问题相信你们仔细看完都能怼回面试官。github
除了面试会问到以外平时的应用其实也蛮多,像以前谈到的 Guava 中 Cache 的实现就是利用 ConcurrentHashMap 的思想。面试
同时也能学习 JDK 做者大牛们的优化思路以及并发解决方案。数组
参考资料:https://www.cnblogs.com/fsychen/p/9361858.html安全
参考资料git:https://github.com/crossoverJie/JCSprout并发