I have a pre-populated array list. And I have multiple threads which will remove elements from the array list. Each thread calls the remove method below and removes one item
That should be fine as long as you don't require the "remove" method to be atomic.
In other words, if the "do something" checks that the item appears more than once in the list for example, it is possible that the result of that check will be wrong by the time you reach the next line.
Also, make sure you synchronize on the list when iterating:
synchronized(list) {
for (Object o : list) {}
}
As mentioned by Peter Lawrey, CopyOnWriteArrayList can make your life easier and can provide better performance in a highly concurrent environment.