拍摄集合的快照

时间:2014-04-03 17:17:54

标签: java collections set

我已设置项目,并希望将其发送以进行并行处理。

但是,我想在之后修改原始集并且它会导致一些并发问题,所以我认为拍摄快照或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();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

在我看来,最优雅的解决方案是使用Set.addAll()方法。

Set set;
Set snapshot = new TreeSet<>(); //or any Set implementation you use
snapshot.addAll(set);