本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接
为什么没有针对ConcurrentHashMap的ConcurrentHashSet?
HashSet基于HashMap。
如果我们看一下HashSet实现,所有内容都在下管理HashMap<E,Object>。
用作的键HashMap。
而且我们知道这HashMap不是线程安全的。这就是我们使用ConcurrentHashMapJava的原因。
基于此,我感到困惑的是,为什么我们没有应该基于的ConcurrentHashSet ConcurrentHashMap?
还有什么我想念的吗?我需要Set在多线程环境中使用。
另外,如果我想创建自己的应用程序,是否ConcurrentHashSet可以通过仅替换HashMaptoConcurrentHashMap并将其余部分保持原样来实现?
高分回答:
没有内置类型,ConcurrentHashSet因为您总是可以从Map中派生集合。由于地Map类型很多,因此您可以使用一种方法从给定的地图(或地图类)生成一个集合。
在Java 8之前,您可以使用生成由并发哈希图支持的并发哈希集。 Collections.newSetFromMap(map)
在Java 8(由@马特指出的),你可以得到一个并发的哈希集合视图通过ConcurrentHashMap.newKeySet()。这比旧版本newSetFromMap要简单一些,旧版本要求您传入一个空的Map对象。但这是特定于的ConcurrentHashMap。
无论如何,Java设计人员每次创建新的Map接口时都可以创建一个新的set接口,但是当第三方创建自己的Map时,该模式将无法实施。最好有静态的方法来推导新的集合。即使您创建自己的Map实现,该方法也始终有效。
高分回答:
Set<String> mySet = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());tion<User> authorizedUsers = filter(allUsers, isAuthorized);
文章翻译自kgs4h5t57thfb6iyuz6dqtun5y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/6…
作者建议: ConcurrentHashMap可以转换成set的
hashmap很多讲的,比如jdk1.7的头插法成环问题,1.8解决的尾插法,hashmap的初始容量,扩容,hash算法、线程安全问题(concurrentHashMap-cas+sync), 还有一个就是计算size.
JDK1.8 size 是通过对 baseCount 和 counterCell 进行 CAS 计算,最终通过 baseCount 和 遍历 CounterCell 数组得出 size。主要是思想通过数组的方式,提高了吞吐。
建议读几遍源码,加深印象。
真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话
求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️