On 5/14/18 5:22 PM, Claes Redestad wrote:
I was actually toying with and testing a change to this effect anyway,
since it's a nice cleanup and might help the JIT somewhat:
http://cr.openjdk.java.net/~redestad/8196340/open.02/
A note on correctness: none of the code in ArrayList that utilize
modCount is "correct" or accurate in a concurrency or thread-safety
context where ordering of loads and stores is critical for
correctness: lacking volatile or other means to ensure correct
ordering of operations (or atomicity of modCount increments) the
runtime is given large amounts of freedoms to do as it please to
optimize things. This is intentional as ArrayList isn't supposed to
be neither thread-safe nor concurrent on its own. The main utility is
instead about detecting and avoid coding errors, mainly bugs like
adding to or removing items from a list you're simultaneously
iterating over. So what I'm saying is that the ordering of operations
within a method might not be all that important as long as they are
sound within the scope of the method execution. Still, making it a bit
more like correct concurrent code might improve the best effort
behavior in some circumstances, and costs us nothing.
I totally agree with this!
For this reason let's move the line
586 final int otherModCount = other.modCount;
to the beginning of equalsArrayList(ArrayList<?> other), so it is
initialized before other.size is read?
With kind regards,
Ivan
Thanks - and sorry for dragging you along for a bit longer...
/Claes
--
With kind regards,
Ivan Gerasimov