On Oct 16, 2013, at 6:41 AM, David Holmes <david.hol...@oracle.com> wrote:
> Okay you have incited me to throw in my 2c :) I think the CME issue has been > raised a number of times in the past (and if the below doesn't agree with > what I've said in the past Hey! It's a brand new day! ;-) ) > > But first, Mike the missing spaces are creeping back in "if(xxx)" :) > > For Map I don't think looking for external concurrent modification and > throwing CME is necessary or worthwhile. These are not thread-safe methods. > That covers: > - remove, replace > > and it implies that putIfAbsent should not check for or throw CME. > > For compute* and merge it is possible that the computation function modifies > the Map - unlikely perhaps but possible - so CME here seems more reasonable. > (As for forEach, replaceAll etc.) > > I fully agree with removing the retry loops in these non-concurrent > implementations. > > That said it makes ConcurrentMap somewhat different to Map as it never throws > CME even if it was an internal mutation. > HashMap.compute*/merge methods do not throw CME either. I suppose those methods could and do so beyond that of only the entry under computation. I think this really points to the fact that, for non-traversal, only concrete implementations are capable of reliably detecting a CME and therefore it's best to leave it up to those implementations should they choose to do so. Paul. > Aside: do you still need to re-list every unchecked exception when overriding > (i.e. @throws foo {@inheritDoc}) to get them to show up in the subtype docs? > I can't tell if this has been forgotten or whether the ConcurrentMap methods > truly will never throw such exceptions. > > Cheers, > David > -----