Я так понял что у нас в программе есть три потока, один основной - main, 2 других мы сами создали. В классе Note в потоке main мы создаем ArrayList, а 2 другими потоками, назовем их вспомогательными😶 заполняем наш ArrayList, затем удаляем записи. Когда запускаю программу среди ожидаемых записей о том какой поток что удалил вылазит :
Нить [Thread-0] удалила свою заметку [Thread-0-Note212]
Exception in thread "Thread-1" java.lang.IndexOutOfBoundsException: Index: 0, Size: 1
	at java.util.ArrayList.rangeCheck(ArrayList.java:657)
	at java.util.ArrayList.remove(ArrayList.java:496)
	at com.javarush.task.task17.task1701.Solution$Note.removeNote(Solution.java:25)
	at com.javarush.task.task17.task1701.Solution$NoteThread.run(Solution.java:47)
Нить [Thread-0] удалила свою заметку [Thread-0-Note213]
Это вылазит потому что 3 потока работают наперегонки? А ArrayList сам автоматически уменьшает свою длину при удалении элементов в отличии от обычного массива, это так? И здесь ошибка потому что один из вспомогательных потоков уже удалил запись и поток в мэйне уменьшил массив, а другой вспомогательный поток об этом не знает и пытается к нему обратиться, я правильно понял?