是以下方法线程安全

时间:2014-03-22 08:44:35

标签: java multithreading thread-safety

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

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

public static Collection<String> checkIfValidUUIDCollectionAndRefine(Collection<String> uuids){
        for(String uuid : uuids){
            if(!checkIfValidUUID(uuid)){
                uuids.remove(uuid);
            }
        }
        return uuids;
    }

2 个答案:

答案 0 :(得分:3)

它将为每个无效的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;

答案 1 :(得分:-1)

您需要synchronized使其thread安全。然后,您需要使用Iterator来避免ConcurrentModificationException