It is not thread-safe. In the absence of synchronization, threads can trample on each other's modification of the list, or might not even see each other's changes to it. Either way, it will be corrupted.
You should get the code working first with Collections.synchronizedList or a synchronized statement around the add call.
If you find that the synchronization on every operation has too much overhead, the next alternative is to give each thread its own private ArrayList, and then periodically, or at the end, dump the contents of the private ArrayLists into the main ArrayList.