Multithreading and Concurrency Flashcards
Как создаются потоки в Java?
Реализация интерфейса Runnable
Наследование от класса Thread
Какие свойства есть у потоков?
уникальный идентификатор в JVM имя приоритет состояние группа потоков
Что такое группы потоков зачем их использовать?
Это множество потоков. Одна группа может быть частью другой.
Когда потоков много(сотни, тысячи), удобно когда они логически сгруппированы, и ими можно управлять как одним целым.
Какие есть состояния потоков в Java?
NEW RUNNABLE BLOCKED WAITING TIMED_WAITING TERMINATED
Что такое семафор?
Это средство обеспечения контроля за доступом к ресурсу. Управляется с помощью счетчика. Если он больше нуля, то доступ разрешается, а значение счетчика уменьшается. Если счетчик равен нулю, то текущий поток блокируется, пока другой поток не освободит ресурс.
Что такое монитор?
Это средство обеспечения контроля за доступом к ресурсу. У монитора может быть максимум один владелец в каждый текущий момент времени.
Что такое deamon thread?
Это поток, который работает в фоном режиме. JVM не ждет завершения daemon потока.
Можно ли конвертировать поток, который стартовал, в daemon поток?
Нет, нельзя. Если вызвать methodthread.setDaemon(true) на потоке, который стартовал, получим IllegalThreadStateException.
Что такое приоритет потоков?
Приоритет - это некоторое число в объекте потока, более высокое значение которого означает больший приоритет. Система в первую очередь выполняет потоки с большим приоритетом, а потоки с меньшим приоритетом получают процессорное время только тогда, когда их более привилегированные собратья простаивают.
В потоках Java приоритет это int значение, от 1 до 10.
Почему wait(), notify(), notifyAll() находятся в классе Object?
Каждый объект в Java имеет монитор. Нет монитора потоков в Java. Каждый объект может используеться для коммуникации между потоками.
Какие способы синхронизации потоков в java вам известны?
- Системная синхронизация с использованием wait/notify.
- Системная синхронизация с использованием join
- Использование классов из пакета java.util.concurrent
Чем отличается wait() от sleep()?
wait() освобождает монитор объекта, поток остается в wait list-e, sleep() просто замораживает поток на определенное параметром время без отпускания монитора.
Как и для чего используется ключевое слово synchronized?
Используется для указания того что метод или блок когда, в любой момент времени, будет выполняться только одним потоком.
Что происходит с монитором объекта, если бросается исключительная ситуация в synchronized блоке/методе?
Монитор гарантировано будет освобожден
Какие особенности вызова методов wait(), notify() и notifyAll()?
Вызываются внутри synchronized блока или метода
Бросают InterruptedException
Зачем используется ключевое слово volatile?
Используется для переменной, чтобы потоки читали ее значение напрямую из памяти и не кешировали ее.
На чем происходит синхронизация в следующих методах?
public static synchronized void ssm(){}
public synchronized void ssm(){}
- Синхронизируется на классе
2. На экземпляре класса
Что лучше, synchronized метод или блок?
Лучше использовать блок, потому что нужно минимизировать количество операций в synchronized блоке. Так же блок позволяет синхронизироваться на другом объекте а не на экземпляре текущего объекта.
Что такое ThreadLocal?
ThreadLocal переменные отличаются от обычных переменных тем, что у каждого потока свой собственный, индивидуально инициализируемый экземпляр переменной, доступ к которой он получает через методы get() или set()
Что такое DeadLock?
Когда два и более потока блокируют друг друга
Как получить deadlock
Взаимное исключение
Задержание ресурса
Нет механизма вытеснения
Циклическое ожидание
Что такое thread pool?
Thread pool это структура которая управляет коллекцией рабочих потоков, она ставит задачи в очередь на выполнение этими потоками
Какие есть thread pools?
SingleThreadExecutor()
FixedThreadPool(int x)
CachedThreadPool()
Что такое atomic операция?
Атомарные операции - операции, выполняющиеся как единое целое либо не выполняющиеся вовсе. Т.е. это операция, во время исполнения которой данные, читаемые/изменяемые этой операцией не могут быть изменены другой операцией.
int++ atomic операция?
Нет, инкремент состоит из чтения значения, прибавления единицы, запись результата.
Что дает интерфейс java.util.concurent.lock.Lock?
void lock()/unlock() boolean trylock() lockInterruptibly() newCondition()
Что такое Condition, ReadWriteLock, ReentrantLock?
Condition - object-wait-notify модель
ReadWriteLock пара lock-ов, один для чтения один для записи
ReentrantLock блокировка подобно ключевому слову synchronized
Какие возможно сти Executors Framework?
Стандартизация вызова
Планирование
Исполнение и контроль асинхронных задач в соответствии с множеством политик выполнения.
Опишите Producer/Consumer pattern?
Какие средства из java.util.concurrent использовать для реализации шаблона?
Один или несколько потоков производят данные, и параллельно этому один или несколько потоков потребляют их.
Использовать BlockingQueue
Что такое Callable и Future?
Callable это интерфейс, подобны Runnable, но может возвращать результат и бросать исключения.
Future это интерфейс который описывает результат асинхронной операции.
Какие средства предоставляет класс Executors?
Фабрика для ExecutorService
ThreadFactory
ScheduleExecutorService
Утилиты для Callable классов
Вам нужно стартовать новый поток и ждать завершения этого потока. Затем продолжить в main потоке. Как это сделать?
Использовать java.lang.Thread.join()
Как запустить поток дважды?
Дважды поток запустить нельзя. Но можно использовать ScheduledThreadPoolExecutor или Timer/TimerTask что бы выполнить поток несколько раз.
Как пробудить поток быстрее, если он заблокирован через sleep?
Вызвать interrupt(), тогда броситься исключение InterruptedException
Что делает метод interrupt()
Прерывает работу потока, находящего в состоянии
waiting
blocked
sleeping
Чем отличается и для чего используются методы interrupt() и interrupted()?
Thread.interrupted() -прерывает текущий поток
threadObject.interupt() -прерывает поток извне, который представлен объектом
Что такое shutdown hook?
Это поток, который исполняется когда JVM прекращает работу Runtime.getRuntime().addShutdownHook(new Thread(){ public void run() {database.close();} });
Что такое голодание (starvation) потока?
Поток с меньшим приоритетом получает меньше времени на выполнение нежели поток с высоким приоритетом
Чем отличается notify() от notifyAll()?
notify() - разблокирует случайный поток
notifyAll() - разблокирует все потоки
Чем отличаются интерфейсы Executor и ExecutorService?
Executor описывает только один метод execute(Runable task)
ExecutorService наследуется от Executor и предлагает дополнительные методы для работы с потоками, также с Callable.
Когда возникает IllegalMonitorStateException?
Поток пытался заблокировать или разблокировать монитор не обладая им.
Какие есть Synchronizers в пакете java.util.concurrent?
Semafore CountDownLatch CyclicBarrier Exchanger Phaser
Какие есть “атомики” в java.util.concurrent?
AtomicBoolean, AtomicInteger, AtomicLong, AtomicIntegerArray, AtomicLongArray, AtomicReference
Что такое Fork/Join framework и какие задачи он решает?
Fork/Join это реализация ExecutorService(класс ForkJoinPool), которая позволяет реализовать divide-and-conquer(разделяй и властвуй) алгоритм
Позволяет разбить обработку, которая будет выполнена одновременно и рекурсивно.
Какое отличие между RecursiveTask и RecursiveActin?
RecursiveTask в методе compute() может возвращать значение, а RecursiveAction нет
Как получить поток который выполняет метод main?
Thread.currentThread() - статический метод, возвращающий текущий поток.
Какие есть коллекции в пакете java.util.concurrent?
CopyOnWriteArrayList
CopyOnWriteArraySet
ConcurrentSkipListMap - является аналогом TreeMap
ConcurrentHashMap - сегментация ConcurrentSkipListSet