Способы создания потоков в Java. Наследование от класса Thread и реализация интерфейса Runnable. Методы start, run, sleep и join. Создание объекта Runnable с помощью лямбда-выражения.
Synchronized в Java — это ключевое слово для обеспечения контроля доступа к общим ресурсам в многопоточной среде. Оно гарантирует, что в данный момент времени только один поток имеет доступ к блоку кода или методу, помеченному как synchronized.
Интерфейс ExecutorService расширяет интерфейс Executor и является реализацией пула Потоков. Объект Runnable и метод execute() - создание и выполнение задач в пуле потоков.
Callable похож на интерфейс Runnable, но в отличие от него объявляет метод call(), который возвращает результат работы потока. Метод call() использует дженерики для указания типа возвращаемого объекта и может бросить проверяемое исключение.
Проблемы многопоточности и способы их решения. Блокирующая и неблокирующая синхронизация. Lock-free программирование. Пакет java.util.concurrent.atomic. Compare-and-Set в Java. Механизм CAS. Atomic. Wait-free.