本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接
ConcurrentHashMap和Collections.synchronizedMap(Map)有什么区别?
我有一个地图,该地图将同时被多个线程修改。
Java API中似乎有三种不同的同步Map实现:
Hashtable
Collections.synchronizedMap(Map)
ConcurrentHashMap
据我了解,Hashtable是一个旧的实现(扩展了过时的Dictionary类),后来对其进行了修改以适合该Map接口。虽然它是同步的,但似乎存在严重的可伸缩性问题,因此不建议用于新项目。
但是其他两个呢?Collections.synchronizedMap(Map)和ConcurrentHashMaps返回的Map之间有什么区别?哪一种适合哪种情况?
高分回答:
为您的需要使用ConcurrentHashMap。它允许从多个线程并发修改Map,而无需阻止它们。Collections.synchronizedMap(map)创建一个阻塞映射,这会降低性能,尽管会确保一致性(如果使用正确)。
如果需要确保数据一致性,并且每个线程都需要具有最新的映射视图,请使用第二个选项。如果性能至关重要,请使用第一个,并且每个线程仅将数据插入到映射中,而读取的频率则较低。
高分回答:
的“可伸缩性问题”以Hashtable完全相同的方式出现Collections.synchronizedMap(Map)-它们使用非常简单的同步,这意味着只有一个线程可以同时访问该映射。
当您具有简单的插入和查找时(除非您非常密集地进行操作),这并不是什么大问题,但是当您需要遍历整个Map时(这对于一个大型Map可能要花很长时间),这将成为一个大问题。一个线程可以执行此操作,如果其他线程想要插入或查找任何内容,则必须等待。
在ConcurrentHashMap使用非常复杂的技术,以减少同步的需要,并允许由多个线程并行读取访问,而无需同步,更重要的是,提供了Iterator一个无需同步,甚至允许地图将互为作用时(修改虽然它不保证是否不会返回在迭代过程中插入的元素)。
文章翻译自kgs4h5t57thfb6iyuz6dqtun5y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/5…
**作者建议:hashmap很多讲的,比如jdk1.7的头插法成环问题,1.8解决的尾插法,hashmap的初始容量,扩容,hash算法、线程安全问题(concurrentHashMap-cas+sync), 还有一个就是计算size. JDK1.8 size 是通过对 baseCount 和 counterCell 进行 CAS 计算,最终通过 baseCount 和 遍历 CounterCell 数组得出 size。主要是思想通过数组的方式,提高了吞吐。
真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话
求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️