- •Что такое ооп?
- •Что такое «абстракция»?
- •Расскажите про основные понятия ооп: «класс», «объект», «интерфейс».
- •Чем различаются jre, jvm и jdk?
- •Какие существуют модификаторы доступа?
- •О чем говорит ключевое слово final?
- •Что вы знаете о функции main()?
- •Какие логические операции и операторы вы знаете?
- •Что такое тернарный оператор выбора?
- •Где и для чего используется модификатор abstract?
- •Дайте определение понятию «интерфейс». Какие модификаторы по умолчанию имеют поля и методы интерфейсов?
- •Чем абстрактный класс отличается от интерфейса? в каких случаях следует использовать абстрактный класс, а в каких интерфейс?
- •Зачем нужны и какие бывают блоки инициализации?
- •Могут ли нестатические методы перегрузить статические?
- •Как получить доступ к переопределенным методам родительского класса?
- •Можно ли объявить метод абстрактным и статическим одновременно?
- •В чем разница между членом экземпляра класса и статическим членом класса?
- •Где разрешена инициализация статических/нестатических полей?
- •Какие типы классов бывают в java?
- •Расскажите про вложенные классы. В каких случаях они применяются?
- •Что такое «статический класс»?
- •Какие существуют особенности использования вложенных классов: статических и внутренних? в чем заключается разница между ними?
- •Что такое «локальный класс»? Каковы его особенности?
- •Что такое «анонимные классы»? Где они применяются?
- •Как работает сборщик мусора?
- •Что такое «пул строк»?
- •Что такое finalize()? Зачем он нужен?
- •Что произойдет со сборщиком мусора, если выполнение метода finalize() требует ощутимо много времени, или в процессе выполнения будет выброшено исключение?
- •Чем отличаются final, finally и finalize()?
- •Расскажите про приведение типов. Что такое понижение и повышение типа?
- •Почему строка является популярным ключом в HashMap в Java?
- •Можно ли использовать строки в конструкции switch?
- •Какая основная разница между String, StringBuffer, StringBuilder?
- •Что такое класс Object? Какие в нем есть методы?
- •Какими свойствами обладает порождаемое equals() отношение эквивалентности?
- •Правила переопределения метода Object.Equals().
- •Могут ли у разных объектов быть одинаковые hashCode()?
- •Опишите иерархию исключений.
- •Какие виды исключений в Java вы знаете, чем они отличаются?
- •Какой оператор позволяет принудительно выбросить исключение?
- •О чем говорит ключевое слово throws?
- •Как написать собственное («пользовательское») исключение?
- •Опишите работу блока try-catch-finally.
- •В чем разница между классами java.Util.Collection и java.Util.Collections?
- •Как поведёт себя коллекция, если вызвать iterator.Remove()?
- •Чем отличается ArrayList от LinkedList? в каких случаях лучше использовать первый, а в каких второй?
- •Как происходит удаление элементов из ArrayList? Как меняется в этом случае размер ArrayList?
- •LinkedList — это односвязный, двусвязный или четырехсвязный список?
- •Как устроен HashMap?
- •Что будет, если добавлять элементы в TreeSet по возрастанию?
- •Расскажите о модели памяти Java?
- •Что такое «потокобезопасность»?
- •Чем отличается процесс от потока?
- •Что такое «зелёные потоки» и есть ли они в Java?
- •Каким образом можно создать поток?
- •Чем различаются Thread и Runnable?
- •В чём заключается разница между методами start() и run()?
- •Как принудительно запустить поток?
- •Что такое «монитор» в Java?
- •Дайте определение понятию «синхронизация».
- •Какие существуют способы синхронизации в Java?
- •В каких состояниях может находиться поток?
- •Можно ли создавать новые экземпляры класса, пока выполняется static synchronized метод?
- •Зачем может быть нужен private мьютекс?
- •Как работают методы wait() и notify()/notifyAll()?
- •В чем разница между notify() и notifyAll()?
- •Для чего используется ключевое слово volatile, synchronized, transient, native?
- •Что значит «приоритет потока»?
- •Почему не рекомендуется использовать метод Thread.Stop()?
- •Что происходит, когда в потоке выбрасывается исключение?
- •Что такое «пул потоков»?
- •Что будет, если очередь пула потоков уже заполнена, но подаётся новая задача?
- •В чём заключается различие между методами submit() и execute() у пула потоков?
- •В чем заключаются различия между cтеком (stack) и кучей (heap) с точки зрения многопоточности?
- •Чем полезны неизменяемые объекты?
- •Даны 3 потока т1, т2 и т3? Как реализовать выполнение в последовательности т1, т2, т3?
- •Что такое «шаблон проектирования»?
- •Назовите основные характеристики шаблонов.
- •Типы шаблонов проектирования.
- •Приведите примеры основных шаблонов проектирования.
- •Приведите примеры порождающих шаблонов проектирования.
- •Приведите примеры структурных шаблонов проектирования.
- •Приведите примеры поведенческих шаблонов проектирования.
- •Что такое «антипаттерн»? Какие антипаттерны вы знаете?
Какие существуют способы синхронизации в Java?
Системная синхронизация с использованием wait()/notify(). Поток, который ждет выполнения каких-либо условий, вызывает у этого объекта метод wait(), предварительно захватив его монитор. На этом его работа приостанавливается. Другой поток может вызвать на этом же самом объекте метод notify() (опять же, предварительно захватив монитор объекта), в результате чего, ждущий на объекте поток «просыпается» и продолжает свое выполнение. В обоих случаях монитор надо захватывать в явном виде, через synchronized-блок, потому как методы wait()/notify() не синхронизированы!
Системная синхронизация с использованием join(). Метод join(), вызванный у экземпляра класса Thread, позволяет текущему потоку остановиться до того момента, как поток, связаный с этим экземпляром, закончит работу.
Использование классов из пакета java.util.concurrent, который предоставляет набор классов для организации межпоточного взаимодействия. Примеры таких классов - Lock, Semaphore и пр.. Концепция данного подхода заключается в использовании атомарных операций и переменных.
В каких состояниях может находиться поток?
Классификация состояний потока:
New - происходит при создании объекта, но еще не запускали методом start;
Runnable - выполняемый. В данном состоянии поток находится после метода start, а также после возврата из других состояний;
Blocked - заблокирован. Это происходит, когда поток заблокирован ожиданием монитора. Монитор - средство синхронизации потоков.
Waiting - ожидающий поток. Поток ждёт выполнения другим потоком определённого действия.
Timed_waiting - временно-ожидающий поток. В таком состоянии поток ждёт выполнения другим потоком определенного действия, но ожидание ограничено временем. По истечении времени ожидания, поток будет снова исполняемым.
Terminated - завершившийся. В этом состоянии поток будет находится, когда метод run завершил свою работу.
Можно ли создавать новые экземпляры класса, пока выполняется static synchronized метод?
Да, можно создавать новые экземпляры класса, так как статические поля не принадлежат к экземплярам класса.
Зачем может быть нужен private мьютекс?
Объект для синхронизации делается private, чтобы сторонний код не мог на него синхронизироваться и случайно получить взаимную блокировку.
Как работают методы wait() и notify()/notifyAll()?
Эти методы поределены у класса Object и предназначены для взаимодействия потоков между собой при межпоточной синхронизации.
wait(): освобождает монитор и переводит вызывающий поток в состояние ожидания до тех пор, пока другой поток не вызовет метод notify()/notifyAll();
notify(): продолжает работу потока, у которого ранее был вызван метод wait();
notifyAll(): возобновляет работу всех потоков, у которых ранее был вызван метод wait().
Когда вызван метод wait(), поток освобождает блокировку на объекте и переходит из состояния Работающий (Running) в состояние Ожидания (Waiting). Метод notify() подаёт сигнал одному из потоков, ожидающих на объекте, чтобы перейти в состояние Работоспособный (Runnable). При этом невозможно определить, какой из ожидающих потоков должен стать работоспособным. Метод notifyAll() заставляет все ожидающие потоки для объекта вернуться в состояние Работоспособный (Runnable). Если ни один поток не находится в ожидании на методе wait(), то при вызове notify() или notifyAll() ничего не происходит.
Поток может вызвать методы wait() или notify() для определённого объекта, только если он в данный момент имеет блокировку на этот объект. wait(), notify() и notifyAll() должны вызываться только из синхронизированного кода.