#вопросы_с_собеседований
Что такое «кооперативная многозадачность»? Какой тип многозадачности использует Java? Чем обусловлен этот выбор?
Преимущества такого подхода - простота реализации, меньшие накладные расходы на переключение контекста.
Недостатки - если один поток завис или ведет себя некорректно, то зависает целиком вся система и другие потоки никогда не получат управление.
В отличие от кооперативной многозадачности управление операционной системе передаётся вне зависимости от состояния работающих приложений, благодаря чему, отдельные зависшие потоки процесса, как правило, не «подвешивают» всю систему целиком. За счёт регулярного переключения между задачами также улучшается отзывчивость приложения и повышается оперативность освобождения ресурсов, которые больше не используются.
В реализации вытесняющая многозадачность отличается от кооперативной, в частности, тем, что требует обработки системного прерывания от аппаратного таймера.
Что такое «кооперативная многозадачность»? Какой тип многозадачности использует Java? Чем обусловлен этот выбор?
Кооперативная многозадачность
- это способ деления процессорного времени между потоками, при котором каждый поток обязан отдавать управление следующему добровольно.Преимущества такого подхода - простота реализации, меньшие накладные расходы на переключение контекста.
Недостатки - если один поток завис или ведет себя некорректно, то зависает целиком вся система и другие потоки никогда не получат управление.
Java
использует вытесняющую многозадачность, при которой решение о переключении между потоками процесса принимает операционная система.В отличие от кооперативной многозадачности управление операционной системе передаётся вне зависимости от состояния работающих приложений, благодаря чему, отдельные зависшие потоки процесса, как правило, не «подвешивают» всю систему целиком. За счёт регулярного переключения между задачами также улучшается отзывчивость приложения и повышается оперативность освобождения ресурсов, которые больше не используются.
В реализации вытесняющая многозадачность отличается от кооперативной, в частности, тем, что требует обработки системного прерывания от аппаратного таймера.
Чем отличается процесс от потока?
Процесс — экземпляр программы во время выполнения, независимый объект, которому выделены системные ресурсы (например, процессорное время и память). Каждый процесс выполняется в отдельном адресном пространстве: один процесс не может получить доступ к переменным и структурам данных другого. Если процесс хочет получить доступ к чужим ресурсам, необходимо использовать межпроцессное взаимодействие. Это могут быть конвейеры, файлы, каналы связи между компьютерами и многое другое.
Для каждого процесса ОС создает так называемое «виртуальное адресное пространство», к которому процесс имеет прямой доступ. Это пространство принадлежит процессу, содержит только его данные и находится в полном его распоряжении. Операционная система же отвечает за то, как виртуальное пространство процесса проецируется на физическую память.
Поток(thread) — определенный способ выполнения процесса, определяющий последовательность исполнения кода в процессе. Потоки всегда создаются в контексте какого-либо процесса, и вся их жизнь проходит только в его границах. Потоки могут исполнять один и тот же код и манипулировать одними и теми же данными, а также совместно использовать описатели объектов ядра, поскольку таблица описателей создается не в отдельных потоках, а в процессах. Так как потоки расходуют существенно меньше ресурсов, чем процессы, в процессе выполнения работы выгоднее создавать дополнительные потоки и избегать создания новых процессов.
Процесс — экземпляр программы во время выполнения, независимый объект, которому выделены системные ресурсы (например, процессорное время и память). Каждый процесс выполняется в отдельном адресном пространстве: один процесс не может получить доступ к переменным и структурам данных другого. Если процесс хочет получить доступ к чужим ресурсам, необходимо использовать межпроцессное взаимодействие. Это могут быть конвейеры, файлы, каналы связи между компьютерами и многое другое.
Для каждого процесса ОС создает так называемое «виртуальное адресное пространство», к которому процесс имеет прямой доступ. Это пространство принадлежит процессу, содержит только его данные и находится в полном его распоряжении. Операционная система же отвечает за то, как виртуальное пространство процесса проецируется на физическую память.
Поток(thread) — определенный способ выполнения процесса, определяющий последовательность исполнения кода в процессе. Потоки всегда создаются в контексте какого-либо процесса, и вся их жизнь проходит только в его границах. Потоки могут исполнять один и тот же код и манипулировать одними и теми же данными, а также совместно использовать описатели объектов ядра, поскольку таблица описателей создается не в отдельных потоках, а в процессах. Так как потоки расходуют существенно меньше ресурсов, чем процессы, в процессе выполнения работы выгоднее создавать дополнительные потоки и избегать создания новых процессов.
📍 Зачем математика нужна в Data Science в 2022?
Библиотека программиста продолжает серию вебинаров по темам, интересным для наших подписчиков. На предстоящем вебинаре аналитик данных Артур Сапрыкин поведает слушателям об актуальных требованиях к дата-сайентистам, математике, необходимой для обучения предсказательных моделей и том, как соответствующие навыки используются на практике для обработки крупных массивов информации.
🧑💻 Для кого: начинающие дата-сайентисты и абитуриенты ШАД
📅 Когда: 8 августа в 19:00
🖇 Где: https://proglib.io/w/fb2c6ce4
#proglib_academy #профессии #datascientist
Библиотека программиста продолжает серию вебинаров по темам, интересным для наших подписчиков. На предстоящем вебинаре аналитик данных Артур Сапрыкин поведает слушателям об актуальных требованиях к дата-сайентистам, математике, необходимой для обучения предсказательных моделей и том, как соответствующие навыки используются на практике для обработки крупных массивов информации.
🧑💻 Для кого: начинающие дата-сайентисты и абитуриенты ШАД
📅 Когда: 8 августа в 19:00
🖇 Где: https://proglib.io/w/fb2c6ce4
#proglib_academy #профессии #datascientist
#вопросы_с_собеседований
Что такое «зелёные потоки» и есть ли они в Java?
Зелёные (легковесные) потоки(green threads) - потоки эмулируемые виртуальной машиной или средой исполнения. Создание зелёного потока не подразумевает под собой создание реального потока ОС.
Виртуальная машина Java берёт на себя заботу о переключении между разными green threads, а сама машина работает как один поток ОС. Это даёт несколько преимуществ. Потоки ОС относительно дороги в большинстве POSIX-систем. Кроме того, переключение между native threads гораздо медленнее, чем между green threads.
Это всё означает, что в некоторых ситуациях green threads гораздо выгоднее, чем native threads. Система может поддерживать гораздо большее количество green threads, чем потоков OС. Например, гораздо практичнее запускать новый green thread для нового HTTP-соединения к веб-серверу, вместо создания нового native thread.
Однако есть и недостатки. Самый большой заключается в том, что вы не можете исполнять два потока одновременно. Поскольку существует только один native thread, только он и вызывается планировщиком ОС. Даже если у вас несколько процессоров и несколько green threads, только один процессор может вызывать green thread. И всё потому, что с точки зрения планировщика заданий ОС всё это выглядит одним потоком.
Начиная с версии 1.2 Java поддерживает native threads, и с тех пор они используются по умолчанию.
Что такое «зелёные потоки» и есть ли они в Java?
Зелёные (легковесные) потоки(green threads) - потоки эмулируемые виртуальной машиной или средой исполнения. Создание зелёного потока не подразумевает под собой создание реального потока ОС.
Виртуальная машина Java берёт на себя заботу о переключении между разными green threads, а сама машина работает как один поток ОС. Это даёт несколько преимуществ. Потоки ОС относительно дороги в большинстве POSIX-систем. Кроме того, переключение между native threads гораздо медленнее, чем между green threads.
Это всё означает, что в некоторых ситуациях green threads гораздо выгоднее, чем native threads. Система может поддерживать гораздо большее количество green threads, чем потоков OС. Например, гораздо практичнее запускать новый green thread для нового HTTP-соединения к веб-серверу, вместо создания нового native thread.
Однако есть и недостатки. Самый большой заключается в том, что вы не можете исполнять два потока одновременно. Поскольку существует только один native thread, только он и вызывается планировщиком ОС. Даже если у вас несколько процессоров и несколько green threads, только один процессор может вызывать green thread. И всё потому, что с точки зрения планировщика заданий ОС всё это выглядит одним потоком.
Начиная с версии 1.2 Java поддерживает native threads, и с тех пор они используются по умолчанию.
Каким образом можно создать поток?
• Создать потомка класса Thread и переопределить его метод run();
• Создать объект класса Thread, передав ему в конструкторе экземпляр класса, реализующего интерфейс Runnable. Эти интерфейс содержит метод run(), который будет выполняться в новом потоке. Поток закончит выполнение, когда завершится его метод run().
• Вызвать метод submit() у экземпляра класса реализующего интерфейс ExecutorService, передав ему в качестве параметра экземпляр класса реализующего интерфейс Runnable или Callable (содержит метод call(), в котором описывается логика выполнения).
• Создать потомка класса Thread и переопределить его метод run();
• Создать объект класса Thread, передав ему в конструкторе экземпляр класса, реализующего интерфейс Runnable. Эти интерфейс содержит метод run(), который будет выполняться в новом потоке. Поток закончит выполнение, когда завершится его метод run().
• Вызвать метод submit() у экземпляра класса реализующего интерфейс ExecutorService, передав ему в качестве параметра экземпляр класса реализующего интерфейс Runnable или Callable (содержит метод call(), в котором описывается логика выполнения).
#вопросы_с_собеседований
В чём заключается разница между методами start() и run()?
Несмотря на то, что
В чём заключается разница между методами start() и run()?
Несмотря на то, что
start()
вызывает метод run()
внутри себя, это не то же самое, что просто вызов run()
. Если run()
вызывается как обычный метод, то он вызывается в том же потоке и никакой новый поток не запускается, как это происходит, в случае, когда вы вызываете метод start()
.🔥 Бесплатная Live coding сессия, где будем решать задачу с собеседования в международную FinTech компанию
В прямом эфире Роман Оборин, Senior Java Developer в BNP Paribas и преподаватель курса Middle Java Dev, проведет Live coding сессию по написанию объектно-ориентированного кода на Java, покрытого разными типами тестов: Unit, Integration, Stress.
На Live сoding ты сможешь понаблюдать, как пишет код Senior-разработчик, прокомментировать процесс и решить реальную задачу, которую дают на собеседованиях. Ну и конечно, прокачаешь свои hard skills:
— Структурируешь знания по принципам SOLID
— Прокачаешь знания по разным видам тестирования, в том числе многопоточных программ
— Подготовишься к техническому интервью с этапом Live coding
🚀 Стартуем 18 августа в 19.00 по МСК
Регистрируйся бесплатно: https://cutt.ly/BZ0wv09
В прямом эфире Роман Оборин, Senior Java Developer в BNP Paribas и преподаватель курса Middle Java Dev, проведет Live coding сессию по написанию объектно-ориентированного кода на Java, покрытого разными типами тестов: Unit, Integration, Stress.
На Live сoding ты сможешь понаблюдать, как пишет код Senior-разработчик, прокомментировать процесс и решить реальную задачу, которую дают на собеседованиях. Ну и конечно, прокачаешь свои hard skills:
— Структурируешь знания по принципам SOLID
— Прокачаешь знания по разным видам тестирования, в том числе многопоточных программ
— Подготовишься к техническому интервью с этапом Live coding
🚀 Стартуем 18 августа в 19.00 по МСК
Регистрируйся бесплатно: https://cutt.ly/BZ0wv09
#вопросы_с_собеседований
Дайте определение понятию «синхронизация».
Синхронизация - это процесс, который позволяет выполнять потоки параллельно.
В Java все объекты имеют одну блокировку, благодаря которой только один поток одновременно может получить доступ к критическому коду в объекте. Такая синхронизация помогает предотвратить повреждение состояния объекта. Если поток получил блокировку, ни один другой поток не может войти в синхронизированный код, пока блокировка не будет снята. Когда поток, владеющий блокировкой, выходит из синхронизированного кода, блокировка снимается. Теперь другой поток может получить блокировку объекта и выполнить синхронизированный код. Если поток пытается получить блокировку объекта, когда другой поток владеет блокировкой, поток переходит в состояние Блокировки до тех пор, пока блокировка не снимется.
Дайте определение понятию «синхронизация».
Синхронизация - это процесс, который позволяет выполнять потоки параллельно.
В Java все объекты имеют одну блокировку, благодаря которой только один поток одновременно может получить доступ к критическому коду в объекте. Такая синхронизация помогает предотвратить повреждение состояния объекта. Если поток получил блокировку, ни один другой поток не может войти в синхронизированный код, пока блокировка не будет снята. Когда поток, владеющий блокировкой, выходит из синхронизированного кода, блокировка снимается. Теперь другой поток может получить блокировку объекта и выполнить синхронизированный код. Если поток пытается получить блокировку объекта, когда другой поток владеет блокировкой, поток переходит в состояние Блокировки до тех пор, пока блокировка не снимется.
#вопросы_с_собеседований
Какие существуют способы синхронизации в Java?
•
•
•
Какие существуют способы синхронизации в Java?
•
Системная синхронизация с использованием wait()/notify()
. Поток, который ждет выполнения каких-либо условий, вызывает у этого объекта метод wait()
, предварительно захватив его монитор. На этом его работа приостанавливается. Другой поток может вызвать на этом же самом объекте метод notify()
(опять же, предварительно захватив монитор объекта), в результате чего, ждущий на объекте поток «просыпается» и продолжает свое выполнение. В обоих случаях монитор надо захватывать в явном виде, через synchronized-блок
, потому как методы wait()/notify()
не синхронизированы!•
Системная синхронизация с использованием join(). Метод join()
, вызванный у экземпляра класса Thread
, позволяет текущему потоку остановиться до того момента, как поток, связанный с этим экземпляром, закончит работу.•
Использование классов из пакета java.util.concurrent
, который предоставляет набор классов для организации межпоточного взаимодействия. Примеры таких классов - Lock
, Semaphore
и пр.. Концепция данного подхода заключается в использовании атомарных операций и переменных.👍 Как правильно писать сообщения коммитов в GIT, чтобы всем было хорошо
Правильно написанные сообщения к коммитам в Git помогают сделать проект с открытым или закрытым исходным кодом удобным для дальнейшей доработки и поддержки. В этой статье вы познакомитесь с различными стратегиями написания хороших сообщений и их использования для оптимизации процесса разработки.
🔗 Основной сайт
🔗 Зеркало
Правильно написанные сообщения к коммитам в Git помогают сделать проект с открытым или закрытым исходным кодом удобным для дальнейшей доработки и поддержки. В этой статье вы познакомитесь с различными стратегиями написания хороших сообщений и их использования для оптимизации процесса разработки.
🔗 Основной сайт
🔗 Зеркало
В каких состояниях может находиться поток?
Потоки могут находиться в одном из следующих состояний:
•
•
•
•
○
○
○
○
Потоки могут находиться в одном из следующих состояний:
•
Новый (New)
. После создания экземпляра потока, он находится в состоянии Новый до тех пор, пока не вызван метод start()
. В этом состоянии поток не считается живым.•
Работоспособный (Runnable)
. Поток переходит в состояние Работоспособный, когда вызывается метод start()
. Поток может перейти в это состояние также из состояния Работающий или из состояния Блокирован. Когда поток находится в этом состоянии, он считается живым.•
Работающий (Running)
. Поток переходит из состояния Работоспособный в состояние Работающий, когда Планировщик потоков выбирает его как работающий в данный момент.•
Живой, но не работоспособный (Alive, but not runnable)
. Поток может быть живым, но не работоспособным по нескольким причинам:○
Ожидание (Waiting)
. Поток переходит в состояние Ожидания, вызывая метод wait()
. Вызов notify()
или notifyAll()
может перевести поток из состояния Ожидания в состояние Работоспособный.○
Сон (Sleeping)
. Метод sleep()
переводит поток в состояние Сна на заданный промежуток времени в миллисекундах.○
Блокировка (Blocked)
. Поток может перейти в это состояние, в ожидании ресурса, такого как ввод/вывод или из-за блокировки другого объекта. В этом случае поток переходит в состояние Работоспособный, когда ресурс становится доступен.○
Мёртвый (Dead)
. Поток считается мёртвым, когда его метод run()
полностью выполнен. Мёртвый поток не может перейти ни в какое другое состояние, даже если для него вызван метод start()
.#вопросы_с_собеседований
Можно ли создавать новые экземпляры класса, пока выполняется static synchronized метод?
Да, можно создавать новые экземпляры класса, так как статические поля не принадлежат к экземплярам класса.
Можно ли создавать новые экземпляры класса, пока выполняется static synchronized метод?
Да, можно создавать новые экземпляры класса, так как статические поля не принадлежат к экземплярам класса.
🔥Меня уволили: 8 способов справиться с потерей работы и найти новую
Увольнение – это всегда стресс. А в нынешнее тяжелое время и вовсе «конец света». Расскажем, как не опускать руки и начать новый эпизод в карьере.
https://proglib.io/sh/9qAhBenSNT
Увольнение – это всегда стресс. А в нынешнее тяжелое время и вовсе «конец света». Расскажем, как не опускать руки и начать новый эпизод в карьере.
https://proglib.io/sh/9qAhBenSNT
Изучить основы Java за 14 дней? По цене пиццы?!
Это реально!
Подключайтесь к нашему подготовительному курсу по Java-разработке.
Начинаем уже 16 августа 📚
Это реально!
Подключайтесь к нашему подготовительному курсу по Java-разработке.
Начинаем уже 16 августа 📚
#вопросы_с_собеседований
В чем разница между notify() и notifyAll()?
Дело в том, что «висеть» на методе
В чем разница между notify() и notifyAll()?
Дело в том, что «висеть» на методе
wait()
одного монитора могут сразу несколько потоков. При вызове notify()
только один из них выходит из wait()
и пытается захватить монитор, а затем продолжает работу со следующего после wait()
оператора. Какой из них выйдет - заранее неизвестно. А при вызове notifyAll()
, все висящие на wait()
потоки выходят из wait()
, и все они пытаются захватить монитор. Понятно, что в любой момент времени монитор может быть захвачен только одним потоком, а остальные ждут своей очереди. Порядок очереди определяется планировщиком потоков Java
.#вопросы_с_собеседований
Почему методы wait() и notify() вызываются только в синхронизированном блоке?
Монитор надо захватывать в явном виде (через
Почему методы wait() и notify() вызываются только в синхронизированном блоке?
Монитор надо захватывать в явном виде (через
synchronized-блок
), потому что методы wait()
и notify()
не синхронизированы.#вопросы_с_собеседований
Что такое livelock?
Реальный пример livelock, – когда два человека встречаются в узком коридоре и каждый, пытаясь быть вежливым, отходит в сторону, и так они бесконечно двигаются из стороны в сторону, абсолютно не продвигаясь в нужном им направлении.
Что такое livelock?
livelock
– тип взаимной блокировки, при котором несколько потоков выполняют бесполезную работу, попадая в зацикленность при попытке получения каких-либо ресурсов. При этом их состояния постоянно изменяются в зависимости друг от друга. Фактической ошибки не возникает, но КПД системы падает до 0. Часто возникает в результате попыток предотвращения deadlock.Реальный пример livelock, – когда два человека встречаются в узком коридоре и каждый, пытаясь быть вежливым, отходит в сторону, и так они бесконечно двигаются из стороны в сторону, абсолютно не продвигаясь в нужном им направлении.
#вопросы_с_собеседований
Как проверить, удерживает ли поток монитор определённого ресурса?
Метод
Как проверить, удерживает ли поток монитор определённого ресурса?
Метод
Thread.holdsLock(lock)
возвращает true
, когда текущий поток удерживает монитор у определённого объекта.Большой гайд. Пишем микросервисы на Java и Spring Boot, заворачиваем в Docker, запускаем на EKS, мониторим на Grafana.
https://habr.com/ru/post/682720/
https://habr.com/ru/post/682720/
Хабр
Большой гайд. Пишем микросервисы на Java и Spring Boot, заворачиваем в Docker, запускаем на EKS, мониторим на Grafana
Туториалы делятся на две больших категории: либо "как нарисовать сову", либо подробно расписанные тысячи шагов в формате "напиши туториал для дурака - и только дурак захочет его читать". К какой из...