有没有其他选择检查,然后对同步列表采取行动?

时间:2017-03-11 13:41:48

标签: java list collections

List synchronizedList=new Collections.synchronizedList(new ArrayList());
synchronized (synchronizedList) {
    if (synchronizedList.size() > 0) {
        System.out.println(synchronizedList.get(0));
    }
}

对于上面的代码,首先我们检查然后act.can我们使用CopyOnwriteArrayList实现这个功能而不检查然后行动。

2 个答案:

答案 0 :(得分:1)

总之,没有。即使CopyOnWriteArrayList也没有提供原子操作来检查列表中是否存在元素并在其上执行某些代码,如Map的接口computeIfPresent。长话短说 - 你必须自己实现这个逻辑,就像你在问题的片段中所做的那样。

答案 1 :(得分:1)

没有同步这是安全的:

// given CopyOnWriteArrayList<T> list
Iterator<T> iterator = list.iterator();
if (iterator.hasNext()) {
    return iterator.next();
}

CopyOnWriteArrayList.iterator的此属性保证安全:

  

返回的迭代器提供构造迭代器时列表状态的快照。遍历迭代器时不需要同步。

因此,如果在获得迭代器时列表不为空, 第一项(或任何其他项目), 将仍然存在并可访问, 即使其他线程可能已在列表中调用removeclear。 (这个工作的原因是由于这个类的写时复制性质。)