On Oct 14 2013, at 02:32 , Paul Sandoz wrote:

>> Virtually all the cases where CME is thrown in the "new" Map defaults are 
>> the points where previously the implementation would have looped/retried.
>> 
> 
>>> For the cases where no function values are passed it has very limited 
>>> value, we know it is effectively useless for non-current collections being 
>>> modified concurrently.
>> 
>> Understood. The alternative would be to GIGO these situations, return and 
>> ignore them. 
>> 
> 
> Yeah, unnecessarily complicates the code.

It does detect legitimate errors and it makes me uncomfortable to just ignore 
them.

>>> For the cases where a function value is passed and it modifies the map then 
>>> it could have some value. But i wonder, for any non-looping function value 
>>> accepting method on Map (anything other than forEach/replaceAll), whether 
>>> it is just simpler to state: "if a function value modifies the entry under 
>>> computation then this method may return incorrect results`".
>> 
>> Modification of any other entry may have the same result.
> 
> Yes, although IIUC modification, by the function value, of other entries will 
> not interfere with that of operating on the entry under computation. A more 
> general recommendation is the function values should be stateless.
> 
> 
>> I suspect that modification by some other thread is as likely to be a 
>> problem as modification by the function.
>> 
> 
> And under concurrent modification we cannot deterministically detect. CME in 
> the non-concurrent collections is only useful for detecting serial 
> modification due to inversion of control, and in these particular cases it is 
> really very limited as to what it detects.

True, but it generally doesn't impose any extra cost. The error detection 
happens as a side effect of necessary operations.

I'd like to bring this set of changes to conclusion as soon as possible.

Mike

Reply via email to