Я читал Пункт 60 "Эффективная Java", а именно: "Рекомендуем использовать стандартные исключения".
Еще одно исключение общего назначения, о котором стоит знать, — это ConcurrentModificationException. Это исключение следует вызывать, если объект, предназначенный для использования одним потоком или с внешней синхронизацией, обнаруживает, что он одновременно изменяется.
Обычно люди сталкиваются с CME
, когда пытаются удалить из коллекции во время цикла.
Но здесь меня интересует, что может быть кратким примером обнаружения одновременной модификации самореализуемого объекта класса?
Я ожидаю, что это будет что-то вроде синхронизации внутреннего объекта и соответствующего логического флага, если другой поток сталкивается с ложным флагом, а затем генерирует исключение.
Для простого исследования я нашел в источнике ArrayList
:
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
но принцип, лежащий в основе того, как поддерживается modCount
. Я не могу найти, где он уменьшается.
add
у вас есть эта строка:ensureCapacityInternal(size + 1); // Increments modCount!!
- person assylias   schedule 29.03.2013