I have found a same question in I used synchronized list, and i still get ConcurrentModificationException, but i didn't find a correct answer.
Here is how i defined my synchronized list:
private List<ActionItemClickListener> actionItemClickListeners = Collections.synchronizedList(new ArrayList<ActionItemClickListener>());
And here is how i used it:
@Override
public void onBackPressed() {
    boolean isConsume = false;
    synchronized (actionItemClickListeners) {
        //ConcurrentModificationException occur here
        for (ActionItemClickListener listener : actionItemClickListeners) {
            isConsume = isConsume | listener.onSystemBackPressed();
        }
    }
    if(!isConsume) {
        pendingFragment = null;
        pendingTag = null;
        currentFragmentTag = null;
        super.onBackPressed();
    }
}
public void addActionItemClickListener(ActionItemClickListener listener) {
        synchronized (actionItemClickListeners) {
            if (listener != null)
                actionItemClickListeners.add(listener);
        }
}
public void removeActionItemClickListener(ActionItemClickListener listener) {
        synchronized (actionItemClickListeners) {
            if (listener != null)
                actionItemClickListeners.remove(listener);
        }
}
Why i'm still getting ConcurrentModificationException???
 
     
    