public class Solution {
    public static void main(String[] args) throws InterruptedException {
        new NoteThread().start();
        new NoteThread().start();
    }

    public static class Note {

        public static final List<String> notes = new ArrayList<>();

        public static void addNote(String note) {
            notes.add(0, note);
            System.out.println("Нить [" + Thread.currentThread().getName() + "] добавила заметку [" + note + "]");
        }

        public static void removeNote(String threadName) {
            String note = notes.remove(0);
            if (note == null) {
                System.out.println("Другая нить удалила нашу заметку");
            } else if (!note.startsWith(threadName)) {
                System.out.println("Нить [" + threadName + "] удалила чужую заметку [" + note + "]");
            } else {
                System.out.println("Нить [" + threadName + "] удалила свою заметку [" + note + "]");
            }
        }
    }

    public static class NoteThread extends Thread {

        @Override
        public void run() {
            for (int i = 0; i < 5; i++) {
                Note.addNote(getName() + "-Note" + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Note.removeNote(getName());
            }
        }
    }
}
Немного модифицировал программу, чтобы понять что происходит. Вывод получился такой: Нить [Thread-0] добавила заметку [Thread-0-Note0] Нить [Thread-1] добавила заметку [Thread-1-Note0] Нить [Thread-1] удалила свою заметку [Thread-1-Note0] Нить [Thread-0] удалила свою заметку [Thread-0-Note0] Нить [Thread-1] добавила заметку [Thread-1-Note1] Нить [Thread-0] добавила заметку [Thread-0-Note1] Нить [Thread-0] удалила свою заметку [Thread-0-Note1] Нить [Thread-1] удалила чужую заметку [Thread-0-Note1] Нить [Thread-0] добавила заметку [Thread-0-Note2] Нить [Thread-1] добавила заметку [Thread-1-Note2] Нить [Thread-1] удалила свою заметку [Thread-1-Note2] Нить [Thread-0] удалила чужую заметку [Thread-1-Note2] Нить [Thread-1] добавила заметку [Thread-1-Note3] Нить [Thread-0] добавила заметку [Thread-0-Note3] Нить [Thread-1] удалила чужую заметку [Thread-0-Note3] Нить [Thread-0] удалила свою заметку [Thread-0-Note3] Нить [Thread-1] добавила заметку [Thread-1-Note4] Нить [Thread-0] добавила заметку [Thread-0-Note4] Нить [Thread-1] удалила чужую заметку [Thread-0-Note4] Нить [Thread-0] удалила свою заметку [Thread-0-Note4] Вопрос по выделенным сообщениям. Заметки выделенные жирным курсивом были удалены на предыдущем шаге (выделены просто жирным). Как такое происходит? И где удаление следующих заметок: Thread-0-Note2, Thread-1-Note3, Thread-1-Note4 ???