There are some situations where using a "CopyOnWriteArrayList" would solve the problem. A lot depends on the ratio of iteration vs deletes/inserts, and on how much trouble you might get into working from a snapshot of the ArrayList rather than the ArrayList itself.
More info here:
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CopyOnWriteArrayList.htmlIt is also discussed in the concurrency section of the Java Tutorials.
Alternatively, I seem to recall princec explaining this method (but can't find the original post):
(1) make a copy the ArrayList
(2) as you go through the originals, if there is something to delete, do it to the copy
(3) once the iteration is done, make the copy the new ArrayList.
Marking objects for live/dead in the collision pass makes a LOT of sense, combined with alternating the collision checks with the cleanups. Otherwise, if you start synchronizing the objects to prevent the concurrency error, the resulting blocking could really slow things down.