JavaRush /Курсы /Java Multithreading /Вопросы с собеседования 7 уровень

Вопросы с собеседования 7 уровень

Java Multithreading
7 уровень , 14 лекция
Открыта

— Привет, Амиго!

Вопросы к собеседованиям
1 Что такое дедлок?
2 Какие вы знаете стратегии, предотвращающие появление дедлоков?
3 Могут ли возникнуть дедлоки при использовании методов wait-notify?
4 Что чаще используется: notify или notifyAll?
5 Метод wait рекомендуется использовать с конструкциями if или while?
6 Что происходит после вызова метода notifyAll?
7 Какие выгоды получает объект, если он immutable?
8 Что такое «thread-safe»?
9 Что такое «happens-before»?
10 Что такое JMM?
11 Какое исключение вылетит, если вызвать wait не в блоке synchronized?
Комментарии (20)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
very junior java developer Уровень 51
6 июня 2023
wokku Уровень 51
21 августа 2023
Бесплатной версией chatGpt лучше вообще не пользоваться, только 4.0
Jambo Уровень 50
22 октября 2023
почему?
wokku Уровень 51
22 октября 2023
Она намного глупее
22 октября 2022
Давно тут никто не отмечался =)
Anonymous #3091828 Уровень 51
9 ноября 2022
Доп. лекции заставили попотеть.
Ars Уровень 41
25 октября 2021
- Что такое дедлок? - Это пожилой чернокнижник.
Дмитрий Уровень 41
25 марта 2021
Вопросы к Собеседованию (Ответы) - Часть 1 1. Что такое дедлок? Дедлок (DeadLock) — взаимная блокировка. В самом простом случае в дедлоке участвуют две нити и два объекта-мютекса. Взаимная блокировка возникает, когда: А) Каждой нити в процессе работы нужно захватить оба мютекса. Б) Первая нить захватила первый мютекс и ждет освобождения второго. В) Вторая нить захватила второй мютекс и ждет освобождения первого. 2. Какие вы знаете стратегии, предотвращающие появление дедлоков? Самая лучшая стратегия – это продуманная архитектура и набор правил, когда можно использовать блокировки (захват мютексов) и в каком порядке. Классический способ борьбы с проблемой — разработка иерархии блокировок, установление правила, что некоторые блокировки никогда не могут захватываться в состоянии, в котором уже захвачены какие-то другие блокировки. Иногда, например, блокировкам присваивают уровни, требуя при этом от нити захватывать блокировки в порядке от большего уровня к меньшему, но не в обратном. Так же нельзя захватывать несколько блокировок одного уровня. 3. Могут ли возникнуть дедлоки при использовании методов wait-notify? Могут, рассмотрим пример:

public class JobQueue
{
 ArrayList jobs = new ArrayList();

 public synchronized void put(Runnable job)
 {
  jobs.add(job);
  this.notifyAll();
 }

 public synchronized Runnable getJob()
 {
  while (jobs.size()==0)
   this.wait();

  return jobs.remove(0);
 }
}
Дмитрий Уровень 41
25 марта 2021
Вопросы к Собеседованию (Ответы) - Часть 2 Метод wait вызывается только внутри блока synchronized, у объекта-мютекса. В нашем случае – это this. При этом происходит две вещи: 1) Нить засыпает. 2) Нить временно освобождает мютекс (пока не проснется). После этого другие нити могу входить в блок synchronized и занимать этот же мютекс. Метод notifyAll тоже можно вызвать только внутри блока synchronized у объекта-мютекса. В нашем случае – это this. При этом происходит две вещи: 1) Просыпаются все нити, которые заснули на этом же объекте-мютексе. 2) Как только текущая нить выйдет из блока synchronized, одна из проснувшихся нитей захватит мютекс и продолжит свою работу. Когда она освободит мютекс, другая проснувшаяся нить захватит мютекс и т.д. Очень похоже на автобус. Вы заходите внутрь, хотите передать за проезд, а водителя нет. И вы «засыпаете». Со временем вас набивается целый автобус, но за проезд пока никто не передает – некому. Затем заходит водитель, вы слышите « – Передаем за проезд». И тут начинается… 4. Что чаще используется: notify или notifyAll? notify обычно советуют использовать ради оптимизации. Во всех остальных случаях рекомендуют использовать метод notifyAll. 5. Метод wait рекомендуется использовать с конструкциями if или while? Нужно поместить условие, которое вы проверяете, в цикл while, а не в оператор if, из-за проблемы, известной как ложные пробуждения. Это где ожидающий поток иногда может быть повторно активирован без notify() вызова. Помещение этой проверки в цикл while гарантирует, что в случае ложного пробуждения условие будет перепроверено, и поток снова вызовет wait().
Дмитрий Уровень 41
25 марта 2021
Вопросы к Собеседованию (Ответы) - Часть 3 6. Что происходит после вызова метода notifyAll? 1) Просыпаются все нити, которые заснули на объекте-мютексе. 2) Как только текущая нить выйдет из блока synchronized, одна из проснувшихся нитей захватит мютекс и продолжит свою работу. Когда она освободит мютекс, другая проснувшаяся нить захватит мютекс и т.д. 7. Какие выгоды получает объект, если он immutable? У неизменяемых объектов много полезных свойств. Но можно выделить два, которые характерны практически для всех immutable-объектов: 1) Неизменяемые объекты можно реализовать значительно проще, чем изменяемые. 2) Неизменяемые объекты можно свободно использовать одновременно из разных нитей. 8. Что такое «thread-safe»? Потоковая Безопасность (англ. thread-safety) — это концепция программирования, применимая к многопоточным программам. Код потокобезопасен, если он функционирует исправно при использовании его из нескольких потоков одновременно. В частности, он должен обеспечивать правильный доступ нескольких потоков к разделяемым данным. В общем случае потоковая безопасность достигается сложно. Но существует несколько источников выявления нарушений потоковой безопасности: ⠀• доступ к глобальным переменным или динамической памяти (куче); ⠀• выделение/освобождение ресурсов, имеющих глобальные ограничения (файлы, процессы и ⠀⠀др.); ⠀• неявный доступ через ссылки и указатели; ⠀• побочный эффект функций.
Дмитрий Уровень 41
25 марта 2021
Вопросы к Собеседованию (Ответы) - Часть 4 9. Что такое «happens-before»? Пусть есть поток X и поток Y (не обязательно отличающийся от потока X). И пусть есть операции A (выполняющаяся в потоке X) и B (выполняющаяся в потоке Y). В таком случае, A happens-before B означает, что все изменения, выполненные потоком X до момента операции A и изменения, которые повлекла эта операция, видны потоку Y в момент выполнения операции B и после выполнения этой операции. «happens before» (дословно «случилось перед») - было придумано ряд правил/условий, при наступлении которых память синхронизируется – обновляется до актуального состояния. Вот некоторые условия синхронизации памяти: ⠀• В рамках одной нити любая команда happens-before (читается «случается перед») любой операцией, следующей за ней в исходном коде. ⠀• Освобождение лока (unlock) happens-before захватом того же лока (lock). ⠀• Выход из synchronized блока/метода happens-before вход в synchronized блок/метод на том же мониторе. ⠀• Запись volatile поля happens-before чтение того же самого volatile поля. ⠀• Завершение метода run экземпляра класса Thread happens-before выход из метода join() или возвращение false методом isAlive() экземпляром той же нити. ⠀• Вызов метода start() экземпляра класса Thread happens-before начало метода run() экземпляра той же нити. ⠀• Завершение конструктора happens-before начало метода finalize() этого класса ⠀• Вызов метода interrupt() на нити happens-before, когда нить обнаружила, что данный метод был вызван, либо путем выбрасывания исключения InterruptedException, либо с помощью методов isInterrupted() или interrupted()
Дмитрий Уровень 41
25 марта 2021
Вопросы к Собеседованию (Ответы) - Часть 5 10. Что такое JMM? Модель Памяти Java (англ. Java Memory Model, JMM) описывает поведение потоков в среде исполнения Java. Модель памяти — часть семантики языка Java, и описывает, на что может и на что не должен рассчитывать программист, разрабатывающий ПО не для конкретной Java-машины, а для Java в целом. или JMM это верхушка айсберга. Под водой сам айсберг — теория многопоточного программирования. Под айсбергом — Ад. Источник: Откуда растут ноги у Java Memory Model 11. Какое исключение вылетит, если вызвать wait не в блоке synchronized? IllegalMonitorStateException
3 апреля 2021
В ответе на вопрос 3

 ArrayList jobs = new ArrayList();
добавить

ArrayList <Runnable> jobs = new ArrayList<>();
26 января 2024
А каким образом тут происходит дедлок? В getJob разве поток не засыпает и не освобождает блокировку? public class JobQueue { ArrayList jobs = new ArrayList(); public synchronized void put(Runnable job) { jobs.add(job); this.notifyAll(); } public synchronized Runnable getJob() { while (jobs.size()==0) this.wait(); return jobs.remove(0); } }
Akhmarzhan Islambek Уровень 36
9 марта 2021
1. Deadlock describes a situation where two or more threads are blocked forever, waiting for each other 2. To prevent deadlock use thread-safety or blockingqueue 3. This requires careful code design using wait-notify, which ensures that all threads receive locks in the same order 4. notifyAll will only be used if you expect more than one thread to be waiting for a lock, while notify method will be called in a synchronized context, a thread pool, so its use is most frequent 5. Always prefer notifyAll() over notify() unless you have a massively parallel application where a large number of threads all do the same thing. 6. notifyAll() wakes all of the threads that are blocked in wait() calls. Then threads are returning from wait() one-by-one, but they each will get their turn. 7. Some of the key benefits of immutable objects are: Thread safety, Atomicity of failure, Absence of hidden side-effects, Protection against null reference errors, Ease of caching, Prevention of identity mutation, Avoidance of temporal coupling between methods, Support for referential transparency, Protection from instantiating logically-invalid objects, Protection from inadvertent corruption of existing objects 8. When a thread is already working on an object and preventing another thread on working on the same object, this process is called Thread-Safety. 9. The Java happens before guarantee is a set of rules that govern how the Java VM and CPU is allowed to reorder instructions for performance gains. 10. Java memory model describes how threads in the Java programming language interact through memory. 11. In order to invoke wait(), this call must be placed in synchronized block, otherwise an IllegalMonitorStateException is thrown.
21 сентября 2017
ответы тут
Кунг-Фу-Панда Уровень 36
7 сентября 2020
спс Бро!
Anonymous #1168137 Уровень 31
18 августа 2017
Если отладка — это процесс удаления багов из кода, то получается, что программирование — это процесс помещения их туда. ;)
RuslanN Уровень 35
30 января 2019
гениально)
Justinian Уровень 41 Master
21 мая 2019
а как иначе ) если жизнь это неизлечимая смертельная болезнь, а выход с комнаты находится там где вход :)