Hello Tagir,

On 2019-06-05 15:49, Tagir Valeev wrote:
Hello, Claes!

Yes, it's true that CME will not be thrown anymore. Depending on the concurrent modification kind one might face various ranges of incorrect behavior, including the AIOOBE, NPE or incorrect array returned. As Collection spec says [1]: > In the absence of a stronger guarantee by the implementation, undefined behavior may result from the invocation of any method on a collection that is being mutated by another thread

In particular it's never mentioned in HashSet, HashMap or Collection spec that toArray implements a fail-fast behavior: this is said only about the iterator() method.

that's not entirely true, since the @implSpec for toArray on
AbstractCollection states it is equivalent to iterating over the
collection[1].

So since the implementations you're changing inherit their current
implementation from AbstractCollection and the iterators of HashMap is
specified to be fail-fast, then that behavior can be argued to be
specified also for the affected toArray methods.

I'm not fundamentally objecting to the behavior change, but I do think
it needs careful review and a CSR (or at least plenty of reviewers
agreeing that one isn't needed).

Also note that ArrayList and LinkedList toArray implementation also never throws CME. LinkedHashSet.toArray in my patch is pretty similar to LinkedList.toArray. So I feel that such change is perfectly acceptable: toArray method has no moral obligation to fail fast, and there's no reason why it should be more "robust" for HashSet than for LinkedList. or ArrayList.

Finally I should note that there are even more unfortunate examples of behavior during the concurrent modification. In particular, querying a TreeMap element during the concurrent update may cause an infinite loop which is usually much more unpleasant than random exception.

Using worse flaws elsewhere seems like a poor excuse to make. Shouldn't
it rather be turned into an argument in favor of fixing TreeMap...?

/Claes

[1] https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/AbstractCollection.html#toArray()

Reply via email to