作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个线程安全的集合,我将按以下方式填充它:
Set set = new HashSet();
for (Map map : maps) {
set.addAll(doSomeExpensiveProcessing(map.keySet()));
}
同时执行此操作的最佳方式是什么? (即每个映射会同时将其键添加到集合中。
编辑 - 我知道 HashSet 不是线程安全的,但就我而言,这超出了问题的范围。
EDIT2 - 正确地指出,对于这个特定的场景,并发不会获得巨大的好处,但会有额外的步骤,我现在已将其包含在代码示例中。
最佳答案
这应该有效:
// NB - Be sure to use a concurrent form of Set here.
Set set = new HashSet();
ArrayList<Map> maps = new ArrayList<>();
public void test() {
for (final Map map : maps) {
new Thread(new Runnable() {
@Override
public void run() {
set.addAll(map.keySet());
}
}).start();
}
}
我知道你对 HashSet
的实现不感兴趣这是并发的,但为了完整起见,我想提一下选项。
你可以考虑 ConcurrentSkipListSet
如果你的对象实现 Comparable
,或者一个 Collections.newSetFromMap(new ConcurrentHashMap<Object,Boolean>())
会做。
关于java - 并发填充一个线程安全的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16673267/
我是一名优秀的程序员,十分优秀!