Is constructor-copy of a synchronized Set thread safe?

java

Solution

Lets take a look at the code:

public HashSet(Collection<? extends E> c) {
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}

So that just calls `addAll`,

public boolean addAll(Collection<? extends E> c) {
    boolean modified = false;
    for (E e : c)
        if (add(e))
            modified = true;
    return modified;
}

So this loops over the `Collection` you give it.

The answer is therefore no, constructor copy is not thread safe.

You need to use your second option and do a explicit `synchronized` on the `Set` before passing it into the constructor.

Problem

The easiest way to get a synchronized version of a java.util.Set would be using Collections.synchronizedSet() like this: ``` Set mySyncSet = Collections.synchronizedSet(new HashSet()); ``` The Java API says about this new object that: It is imperative that the user manually synchronize on the returned set when iterating over it My question is, if I create a copy of this Set using a copy constructor like this: ``` Set mySetCopy = new HashMap(mySyncSet); ``` Wil it be thread-safe? (isn't HashMap constructor using iteration to get members of Set after all?) or should I manually synchronize the operation like this?: ``` Set mySetCopy; synchronized(mySyncSet) { mySetCopy = new HashMap(mySyncSet); } ```

Original source

Related problems