RFR: 8024688: j.u.Map.merge doesn't work as specified if contains key:null pair

Paul Sandoz paul.sandoz at oracle.com
Tue Oct 15 16:38:17 UTC 2013


On Oct 15, 2013, at 6:25 PM, Mike Duigou <mike.duigou at oracle.com> wrote:

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

It is not deterministic. 

Does HashMap's implementation of putIfAbsent throw a CME?


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

There cost to code complexity. I would argue that additional complexity is not worth it given the limits of what can be detected.

I guess you know my opinion: remove 'em. So i will be silent for a bit and see if anyone else speaks up :-)

Paul.

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



More information about the core-libs-dev mailing list