Declaring an array volatile does NOT give volatile access to it's fields. you're declaring the reference itself volatile, not it's 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;