Зачем нужна синхронизация:
Метод wait() можно вызвать только внутри блока synchronized у объекта-мютекса, который был «залочен (заблокирован)» текущей нитью, в противном случае метод выкинет исключение IllegalMonitorStateException.
При вызове метода wait(), текущая нить снимает блокировку с объекта monitor, и переходит в состояние WAITING, ожидая вызова метода monitor.notify() или monitor.notifyAll() другой нитью. Как только это произойдет, нить проснется и если монитор не был занят, то захватит его и продолжит работу.
Если монитор окажется занят другой нитью, текущая нить перейдет в состояние BLOCKED.
(с) Javarush - Ответы на вопросы к собеседованию, уровень 25 пункт 3.
Применение в задаче данного блока прояснится через 2 задачи. Спойлер:
main Thread, выполняющий метод run переходит в состояние waiting и ждет сообщения notify от демона SocketThread, а конкретнее от его метода clientHandshake. Потом Thread main читает консоль и отправляет сообщения от пользователя, а socketThread читает сокет и передает сообщения пользователю от сервера.
(Задача чат)
искать нужные методы по всем классам - двойное нажатие шифта открывает поиск по проекту. Вводить название нужного поля/метода/класса .
Ctrl+ЛКМ по методу или переменной или классу, откроет даже исходники :)
Если искомое выделить перед нажатием шифта - то и вводить ничего не нужно
Порядок инициализации:
1. Статические поля - начиная с от самого старого предка вниз по иерархии до дочернего класса.
2. Статические блоки - начиная от самого старого предка вниз по иерархии до дочернего класса.
3. Нестатические поля, затем нестатические блоки, затем конструктор - самого древнего предка, затем по иерархии вниз таким же образом для каждого класса.
в интерфейсе все переменные, по умолчанию, final.