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
> -----

Reply via email to