Java 以下方法是线程安全的吗

Java 以下方法是线程安全的吗,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,我想知道下面的方法是否是线程安全的 用例:我从不同的位置传递两个集合 public static Collection<String> checkIfValidUUIDCollectionAndRefine(Collection<String> uuids){ for(String uuid : uuids){ if(!checkIfValidUUID(uuid)){ uuids.remove(uui

我想知道下面的方法是否是线程安全的

用例:我从不同的位置传递两个集合

public static Collection<String> checkIfValidUUIDCollectionAndRefine(Collection<String> uuids){
        for(String uuid : uuids){
            if(!checkIfValidUUID(uuid)){
                uuids.remove(uuid);
            }
        }
        return uuids;
    }
公共静态集合检查ifvaliduidCollectionandRefine(集合UUID){
用于(字符串uuid:uuid){
如果(!checkIfValidUUID(uuid)){
uuid.remove(uuid);
}
}
返回uuid;
}

它将为每个无效UUID抛出一个
ConcurrentModificationException

第二点是因为:

    for(String uuid : uuids){
        if(!checkIfValidUUID(uuid)){
            uuids.remove(uuid);
        }
    }
foreach循环在内部创建一个迭代器,但是您可以修改这个迭代器。您必须创建迭代器并使用
.remove()

例如:

final Iterator<String> iterator = uuids.iterator();
String uuid;
while (iterator.hasNext()) {
    uuid = iterator.next();
    if (!checkIfValidUUID(uuid))
        iterator.remove();
}
return uuids;
final Iterator Iterator=uuids.Iterator();
字符串uuid;
while(iterator.hasNext()){
uuid=iterator.next();
如果(!checkIfValidUUID(uuid))
iterator.remove();
}
返回uuid;

您需要使其
同步
以使其
线程
安全。然后您需要使用
迭代器
来避免
ConcurrentModificationException

第二点意味着即使只有一个线程,它也不会工作。第一点并不是真正的结论——如果在不同线程中使用的两个集合是不同的集合,那么这并不是线程本身就不安全的。方法运行时调用方无法修改它。。。他们正在等待方法完成!另一个线程可能正在修改集合,但调用者肯定不会这样做。而且“复制”的想法也不会真正起作用-如果另一个线程正在修改集合,那么在您复制时,这将失败。基本上,您需要要么使用并发集合,要么使用同步(在两个线程中)。但是,我不会说这个线程本质上是“非线程安全的”——它本身不会做任何非线程安全的事情。只是您需要小心,不要使用线程之间共享的集合调用它。@all:以下方法是从spring控制器调用的,传递的集合不是共享的。@JonSkeet text fixed;是的,副本也不起作用。这就是为什么我总是在可能的时候使用Guava的
Immutable*
…在单个线程中甚至都不安全如果每个线程都要在不同的集合中传递,那么就没有共享数据。如果没有共享数据,则该方法是线程安全的。不需要同步,此方法不会与其他线程共享可变状态。@bowmore如果两个线程使用相同的
uuid
调用该方法怎么办?