For one thing, according to the Javadoc below:
If multiple threads access an ArrayList instance concurrently, and at least one of the threads modifies the list structurally, it must be synchronized externally. (A structural modification is any operation that adds or deletes one or more elements, or explicitly resizes the backing array; merely setting the value of an element is not a structural modification.)
synchronization is not necessary.
For another, setting the value of an element is an atomic action so it cannot be interleaved. However, memory consistency errors are still possible.
So which is right?
Edit: Maybe I haven't expressed myself clearly. Actually, I just wanna know whether the Javadoc is wrong or at least misleading. By the way, I said setting the value of an element is an atomic action, but this is obviously wrong.