我已设置项目,并希望将其发送以进行并行处理。
但是,我想在之后修改原始集并且它会导致一些并发问题,所以我认为拍摄快照或Set的某些内容并发送THAt进行处理会很好。
clone
会运作良好吗?
或者我应该自己制作一个新的Set
?
还是有一些我错过的好方法?
编辑:我现在正在使用它,它看起来非常好用:
public class BufferedHashSet<E> extends HashSet<E> {
private List<E> toAdd = new LinkedList<E>();
private List<Object> toRemove = new LinkedList<Object>();
@Override
public boolean add(E e)
{
synchronized (this) {
toAdd.add(e);
return true;
}
}
@Override
public boolean remove(Object e)
{
synchronized (this) {
toRemove.add(e);
return true;
}
}
public void flush()
{
synchronized (this) {
for (E e : toAdd) {
super.add(e);
}
for (Object e : toRemove) {
super.remove(e);
}
toAdd.clear();
toRemove.clear();
}
}
}
答案 0 :(得分:0)
在我看来,最优雅的解决方案是使用Set.addAll()
方法。
Set set;
Set snapshot = new TreeSet<>(); //or any Set implementation you use
snapshot.addAll(set);