javamultithreadingarraylistvolatilecopyonwritearraylist

Does volatile guarantee thread safety? This ArrayList example


I have an ArrayList 'X' that's passed to multiple threads where each thread adds more data to this ArrayList 'X'using addAll(). Obviously there are multi-threading issues here, one option would be to make the addAll() portion of the code 'synchronized' (or) use copyOnWriteArrayList.

But my question here is, would declaring this ArrayList 'volatile' achieve the same purpose? Does JVM order these read/write instructions accordingly and prevent multi-threading issues?


Solution

  • would declaring this ArrayList 'volatile' achieve the same purpose?

    You can't actually. When you write

    volatile ArrayList list;
    

    this makes the list reference volatile, not the underlying ArrayList. It also means that when you do

    list.add(x);
    

    the list is read, so you only get a read barrier not a write barrier.

    NOTE: This doesn't make the operation atomic either which is what you really need, but without a write barrier you might not even see this operation in another thread.

    Does JVM order these read/write instructions accordingly and prevent multi-threading issues?

    It will order the reads accordingly, but not in a way which can be used to avoid multi-threading issues in this case. i.e. there is no way to make this work with volatile, let alone assume the JVM will do what you want without having to worry about it.

    synchronized by comparison can be used correctly. You can still get it wrong, it's not fool proof, but you have a good chance of getting it right.