Java 是否有其他方法可以检查并对同步列表执行操作?

Java 是否有其他方法可以检查并对同步列表执行操作?,java,list,collections,Java,List,Collections,对于上面的代码,我们先检查然后执行。我们是否可以使用CopyOnwriteArrayList实现此功能,而不必检查然后执行。总之,没有。即使是也不提供原子操作来检查列表中是否存在元素,并在其上执行一些代码,如映射的接口computeIfPresent。长话短说-您必须自己实现该逻辑,就像您在问题中的代码片段中所做的那样。这在没有同步的情况下是安全的: List synchronizedList=new Collections.synchronizedList(new ArrayList());

对于上面的代码,我们先检查然后执行。我们是否可以使用CopyOnwriteArrayList实现此功能,而不必检查然后执行。

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

这在没有同步的情况下是安全的:

List synchronizedList=new Collections.synchronizedList(new ArrayList());
synchronized (synchronizedList) {
    if (synchronizedList.size() > 0) {
        System.out.println(synchronizedList.get(0));
    }
}
//给定的CopyOnWriteArrayList列表
迭代器迭代器=list.Iterator();
if(iterator.hasNext()){
返回iterator.next();
}
安全由以下特性保证:

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

因此,如果在获取迭代器时列表不是空的, 第一项(或任何其他事项), 将仍然存在并且可以访问, 即使其他线程可能在列表中调用了
删除
清除

(这之所以有效,是因为该类具有“写时拷贝”的特性。)

为什么认为在使用同步列表时需要同步检查?更重要的是,您想要解决的问题是什么?当您在这里所做的只是阅读时,为什么它需要同步?@GhostCat“为什么您认为在使用同步列表时需要同步检查?”因为只有单个操作是同步的。列表的大小可以在调用
size()
和调用
get(0)
@JoeC之间更改如果另一个线程清空If和println之间的列表,代码将抛出异常。但是,对于COWAL,可以使用类似
list.stream().findFirst().ifPresent(System.out::println)
的东西。
// given CopyOnWriteArrayList<T> list
Iterator<T> iterator = list.iterator();
if (iterator.hasNext()) {
    return iterator.next();
}