Declaring an array volatile does not give volatile access to its fields. You're declaring the reference itself volatile, not its elements.
In other words, you're declaring a volatile set of elements, not a set of volatile elements.
The solution here is to use AtomicIntegerArray
in case you want to use integers. Another way (but kinda ugly) is to rewrite the reference to the array every time you edit a field.
You do that by:
arr = arr;
(as I said... ugly)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…