十大Java ConcurrentHashMap面试问题与解
ConcurrentHashMap类在JDK 1.5上添加的并发集合的一部分,例如BlockingQueue,CopyOnWriteArrayList,CopyOnWriteArraySet等。它是基于Hashtable和HashMap同步的基于哈希的映射实现的替代。它实现了Map和ConcurrentMap(Map的一个子接口)界面,它允许您存储键值对。该类与HashMap或Hashtable类似,但它更具可扩展性,适合并发Java应用程序。与通过危及可扩展性实现线程安全性的Hashtable不同,ConcurrentHashMap使用高级技术,例如将地图分割成段,以保持线程安全性和可扩展性。
由于其性能和可扩展性以及线程安全性,它是并行Java应用程序中Map最受欢迎的选择。通常,使用并发集合替换同步集合可以大大提高Java应用程序的可扩展性,而且风险很小,如Java并发实践中所建议的那样。
Java ConcurrentHashMap面试问题与答案
这里有一些最好的和经常问到的Java ConcurrentHashMap面试问题。这些问题是从真实面试中收集的,因此,如果您在面试中已经看过他们,请不要惊讶。这些问题不仅可以帮助您在面试中做得很好,还可以鼓励您更多地了解并发哈希贴图,从而最终帮助您进行日常的编程工作。
什么是Java中的ConcurrentHashMap?(回答)
java.util.concurrent.ConcurrentHashMap是在JDK 1.5上添加的并发收集类,用于替代基于哈希的同步映射实现,例如Hashtable和HashMap。他们的同步对手提供更好的性能和可扩展性,风险很小。
是ConcurrentHashMap线程安全的Java? (回答)
是的,ConcurrentHashMap在Java中是线程安全的,这意味着两个线程可以修改地图而不会损坏其内部数据结构,例如数组和链表。如果将它与不是线程安全的HashMap进行比较,则将HashMap暴露给多个线程可能会损坏内部数据结构,并可能会使地图完全无用,因为许多链接可能丢失或指向错误的元素。
ConcurrentHashMap如何实现线程安全? (回答)
java.util.ConcurrentHashMap通过将地图分割成段并且仅锁定所需的段而不是锁定整个地图来实现线程安全性。所以,是的,它使用锁定来实现线程安全,但由于它不会锁定整个地图,所以它的性能更好。这种技术也被称为锁剥离。
同时可以从ConcurrentHashMap读取多个线程吗? (回答)
是的,ConcurrentHashMap允许并行读取而不锁定,因为读取操作不需要锁定或线程安全。
同时可以在ConcurrentHashMap上一个线程读取和其他写入吗? (回答)
是的,可以为少数的作家。例如,如果写入操作正在修改ConcurrentHashmap的一个段,并且读取操作正在其他段发生,则读取器将不会阻止,但是如果读取器线程也尝试从相同的段读取,直到写入器完成。
ConcurrentHashMap如何在内部工作? (回答)
当涉及到存储键/值对和检索值时,java.util.ConcurrentHashMap与HashMap类似。其实现的唯一区别来自于并发视角,以及它如何实现线程安全。它将地图划分为几个段,默认为16,也称为同步级别。
因此,并发get(),put(),contains()操作是可能的,因为它永远不会锁定整个映射,只有相关的段被锁定。这意味着读者可以与作者一起访问地图并发,并且有限数量的作者可以同时修改地图。结果是更好的吞吐量和可扩展性。有关ConcurrentHashMap类实现的详细信息,请参阅Java并发实践。
这是一个解释如何在Java的ConcurrentHashMap中如何看起来的图,基本上它只是一个迷你哈希表,其中包含有一个桶和哈希条目的链接列表,以防发生冲突:
由于ConcurrentHashMap返回的迭代器是弱的一致性,所以最近的并发修改可能会也可能不是可见的。此类操作无法保证。我建议您阅读 Java并发实践中的更多信息,了解如何通过Java中的ConcurrentHashMap来处理并发性。
如何在ConcurrentHashMap中原子更新值? (回答)
如果要原子更新ConcurrentHashMap中的现有值,可以使用concurrentHashMap的replace()函数。它接受旧值和新值,只有当地图中的现有值与提供的旧值匹配时才更新地图,这意味着地图在其调用期间不会同时修改。如果现有值更改并且与旧值不匹配,则替换失败并返回false。您可以在while循环中使用replace()方法,直到成功,如下所示:
ConcurrentMap < String,Long> populationByCities = new ConcurrentHashMap <>();做 {
您还可以看到 Java SE 8 for Really不耐烦的一些代码示例,以原子方式更新ConcurerntHashMap中的现有值。
在迭代ConcurrentHashMap时如何删除映射? (回答)
您可以使用Iterator从Java中删除ConcurrentHashMap中的映射,如下所示:
map < String,Integer> bookAndPrice = new ConcurrentHashMap <>();
ConcurrentHashMap的迭代器是否故障安全或故障快速? (回答)
ConcurrentHashMap的迭代器是一个故障安全的迭代器,这意味着它不会抛出ConcurrentModificationException,因此,无需在迭代期间锁定映射。ConcurrentHashMap返回的迭代器也是弱一致的,这意味着如果Map在迭代期间被修改,则它可能反映最近的修改。一般来说,它会在迭代之前创建一个集合的副本。
如果在ConcurrentHashMap中添加一个新映射,而一个线程正在迭代,会发生什么? (回答)
这是与ConcurrentHashMap相关的棘手问题之一。由于ConcurrentHashMap的迭代器是每周一致且故障安全的,所以它们不会与ConcurrentModificationException失败,但是一旦迭代开始,它们也可能看不到任何修改。即使它依赖于实现,JDK通常会为ConposeHashMap创建一个单独的副本,而不是迭代原始副本。
当预期地图可以传递ConcurrentHahsMap的对象吗? (回答)
是因为ConcurrentHashMap实现java.util.concurrent.ConcurrentMap接口,它扩展了java.util.Map接口,因此ConcurrentHashMap是一个映射。此外,您可以将ConcurrentHashMap的对象存储到Map变量中,如下所示:
map < String,Integer> bookAndPrice = new ConcurrentHashMap <>();
虽然这意味着您可能无法访问java.util.concurrent.ConcurrentHashMap类中声明的方法,例如forJDK 8中添加forEachKey()或forEachValue()方法。
这就是关于Java访谈中ConcurrentHashMap的一些常见问题。这些问题不仅可以帮助您在面试中做得很好,还可以鼓励您更多地了解ConcurrentHashMap。考虑到其在每个Java应用程序中的重要性和可用性,预期来自初级和高级Java开发人员的ConcurrentHashMap的良好和坚实的知识。至少应该使用ConcurrentHashMap来理解日常操作,并了解内部实现如何工作,特别是与其他线程安全的地图实现(例如Hashtable和Synchronized HashMap)进行比较时。
进一步阅读
Java编程面试暴露
Java基础知识:集合
从集合到Java 8中使用Lambda表达式
其他 Java面试问题列表你可能想检查
来自编码面试的50个Java程序(列表)
10 Java垃圾收集面试问题(列表)
21 Java最终修改者面试问题(列表)
21 Java继承面试问题与答案(列表)
10日期,时间和日历面试问题与答案(列表)
5 main()方法面试问题(列表)
19 Java重载和覆盖面试问题(列表)
15 Java NIO和网络面试问题与答案(见这里)
21 Java ArrayList面试问题与答案(列表)
来自Java的SQL和UNIX问题访谈(列表)
来自Java的22个数组概念面试问题(列表)
25 Java收集框架面试问题与答案(列表)
15基于Java Enum的面试问题( 列表
转:http://www.tuicool.com/articles/MBVZJve
1、具有1-5工作经验的,面对目前流行的技术不知从何下手,
需要突破技术瓶颈的可以加。2、在公司待久了,过得很安逸,
但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。
3、如果没有工作经验,但基础非常扎实,对java工作机制,
常用设计思想,常用java开发框架掌握熟练的,可以加。
4、觉得自己很牛B,一般需求都能搞定。
但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。
5. 群号:高级架构群 469691824备注好信息!
6.阿里Java高级大牛直播讲解知识点,分享知识,
多年工作经验的梳理和总结,带着大家全面、
科学地建立自己的技术体系和技术认知!
请先 后发表评论~