When two threads are accessing same list, alteast the list accessing part need to be synchronized.
Otherwise for example, one thread might remve a object from the list, in the mean time another thread tries to get the same object from the list, in this cases you may get the Exception IndexOutOfBoundsException.
A number of exceptions can be thrown, depending on the collection and the way the updates overlap. Without proper synchronization an ArrayList's internal structure can become corrupted, and then any RuntimeException can be thrown. ArrayIndexOutOfBoundsException is probably the most common.
Of course, even with synchronization, ConcurrentModificationException is always a possibility when iterating and modifying at the same time. You can even do that using one single process: