public class Solution { public static void main(String[] args) { 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); } 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 { int i = 0; @Override public void run() { try { while(i <= 999){ Note.addNote((getName() + "-Note" + i)); Thread.sleep(1); Note.removeNote(getName()); i++;}} catch (InterruptedException e) { e.printStackTrace(); } } } } В данной задаче не понял кусок кода - "else if (!note.startsWith(threadName)) ", получается, что у нас за время ожидания Thread.sleep(1) успевает добавить несколько элементов в notes, далее сравнивает НЕ начинается ли note с threadName, если не начинается, то срабатывает тело данного блока, я правильно понял?? и второй вопрос: а как происходит сравнение, если note принимает значение удаляенного элемента?