#вопросы_с_собеседований
Почему методы 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
Туториалы делятся на две больших категории: либо "как нарисовать сову", либо подробно расписанные тысячи шагов в формате "напиши туториал для дурака - и только дурак захочет его читать". К какой из...
⌛ Миф о 21 дне: как на самом деле формируются привычки
Проблема привить полезную привычку (или избавиться от вредной) касается каждого из нас. Рассказываем о самых популярных заблуждениях – смотрим фактам в лицо.
🔗 Основной сайт
🔗 Зеркало
Проблема привить полезную привычку (или избавиться от вредной) касается каждого из нас. Рассказываем о самых популярных заблуждениях – смотрим фактам в лицо.
🔗 Основной сайт
🔗 Зеркало
#вопросы_с_собеседований
На каком объекте происходит синхронизация при вызове static synchronized метода?
У синхронизированного статического метода нет доступа к
На каком объекте происходит синхронизация при вызове static synchronized метода?
У синхронизированного статического метода нет доступа к
this
, но есть доступ к объекту класса Class
, он присутствует в единственном экземпляре и именно он выступает в качестве монитора для синхронизации статических методов. Таким образом, следующая конструкция: class SomeClass {
public static synchronized void someMethod() {
//code
}
}
эквивалентна такой:public class SomeClass {
public static void someMethod(){
synchronized(SomeClass.class){
//code
}
}
}
☕ Учебник по Java: инкапсуляция на простых примерах
Защищаем пользовательскую информацию от ошибочных действий с помощью фундаментальной концепции ООП — инкапсуляции.
🔗 Основной сайт
🔗 Зеркало
Защищаем пользовательскую информацию от ошибочных действий с помощью фундаментальной концепции ООП — инкапсуляции.
🔗 Основной сайт
🔗 Зеркало
Станьте гуру кибербезопасности!
Сегодня компании становятся мишенью для атак со стороны хакеров в охоте за деньгами, информацией о готовящихся проектах и новых продуктах. Для проникновения хакеры используют различные методы: от вредоносных программ до специальной инженерии. А теперь представьте, что в 9 из 10 компаний отсутствуют специалисты по информационной безопасности! Представляете, насколько это популярное направление?
На курсе вы научитесь:
– основам веб-разработки;
– управлять базами данных;
– защищать сайты;
– организовывать пен-тесты;
– проверять сайты на защищенность;
– искать уязвимости.
Сейчас IT-специалисты нужны как никогда! Освойте профессию, без которой не обойдётся ни один бизнес!
🔥 Также для IT-специалистов действуют специальные плюшки от государства!
Подробности по ссылке: https://clc.to/aVAewQ
Сегодня компании становятся мишенью для атак со стороны хакеров в охоте за деньгами, информацией о готовящихся проектах и новых продуктах. Для проникновения хакеры используют различные методы: от вредоносных программ до специальной инженерии. А теперь представьте, что в 9 из 10 компаний отсутствуют специалисты по информационной безопасности! Представляете, насколько это популярное направление?
На курсе вы научитесь:
– основам веб-разработки;
– управлять базами данных;
– защищать сайты;
– организовывать пен-тесты;
– проверять сайты на защищенность;
– искать уязвимости.
Сейчас IT-специалисты нужны как никогда! Освойте профессию, без которой не обойдётся ни один бизнес!
🔥 Также для IT-специалистов действуют специальные плюшки от государства!
Подробности по ссылке: https://clc.to/aVAewQ
В чём различия между volatile и Atomic переменными?
volatile принуждает использовать единственный экземпляр переменной, но не гарантирует атомарность. Например, операция count++ не станет атомарной просто потому, что count объявлена volatile. C другой стороны class AtomicInteger предоставляет атомарный метод для выполнения таких комплексных операций атомарно, например getAndIncrement() – атомарная замена оператора инкремента, его можно использовать, чтобы атомарно увеличить текущее значение на один. Похожим образом сконструированы атомарные версии и для других типов данных.
volatile принуждает использовать единственный экземпляр переменной, но не гарантирует атомарность. Например, операция count++ не станет атомарной просто потому, что count объявлена volatile. C другой стороны class AtomicInteger предоставляет атомарный метод для выполнения таких комплексных операций атомарно, например getAndIncrement() – атомарная замена оператора инкремента, его можно использовать, чтобы атомарно увеличить текущее значение на один. Похожим образом сконструированы атомарные версии и для других типов данных.
Создайте погодный бот и бот-генератор паролей за 3 дня на бесплатном интенсиве
Бесплатный интенсив — это возможность протестировать профессию «Разработчик на Python» и решить, подходит ли она вам.
За три дня вы:
— научитесь писать телеграм-боты и программировать на Python;
изучите запросы рынка и требования работодателей c высокими зарплатами;
— создадите два телеграм-бота по «отслеживание погоды» и телеграм-бота «генератор паролей»
— А еще сможете выиграть призы за выполнение домашних заданий на сумму более 500 000 рублей
🔹Станьте на три дня разработчиком на Python
запишитесь на интенсив — https://clc.to/86ct2g
🎁Подарок за регистрацию — карьерный гид с 30+ лайфхаками по освоению профессии разработчика.
Бесплатный интенсив — это возможность протестировать профессию «Разработчик на Python» и решить, подходит ли она вам.
За три дня вы:
— научитесь писать телеграм-боты и программировать на Python;
изучите запросы рынка и требования работодателей c высокими зарплатами;
— создадите два телеграм-бота по «отслеживание погоды» и телеграм-бота «генератор паролей»
— А еще сможете выиграть призы за выполнение домашних заданий на сумму более 500 000 рублей
🔹Станьте на три дня разработчиком на Python
запишитесь на интенсив — https://clc.to/86ct2g
🎁Подарок за регистрацию — карьерный гид с 30+ лайфхаками по освоению профессии разработчика.
#вопросы_с_собеседований
Что значит «приоритет потока»?
Приоритеты потоков используются планировщиком потоков для принятия решений о том, когда какому из потоков будет разрешено работать. Теоретически высокоприоритетные потоки получают больше времени процессора, чем низкоприоритетные. Практически объем времени процессора, который получает поток, часто зависит от нескольких факторов помимо его приоритета.
Чтобы установить приоритет потока, используется метод класса Thread: final void setPriority(int level). Значение level изменяется в пределах от Thread.MIN_PRIORITY = 1 до Thread.MAX_PRIORITY = 10. Приоритет по умолчанию - Thread.NORM_PRlORITY = 5.
Получить текущее значение приоритета потока можно вызвав метод: final int getPriority() у экземпляра класса Thread.
Что значит «приоритет потока»?
Приоритеты потоков используются планировщиком потоков для принятия решений о том, когда какому из потоков будет разрешено работать. Теоретически высокоприоритетные потоки получают больше времени процессора, чем низкоприоритетные. Практически объем времени процессора, который получает поток, часто зависит от нескольких факторов помимо его приоритета.
Чтобы установить приоритет потока, используется метод класса Thread: final void setPriority(int level). Значение level изменяется в пределах от Thread.MIN_PRIORITY = 1 до Thread.MAX_PRIORITY = 10. Приоритет по умолчанию - Thread.NORM_PRlORITY = 5.
Получить текущее значение приоритета потока можно вызвав метод: final int getPriority() у экземпляра класса Thread.
🗿➡️☕ От монолита к микросервисам: как металлурги переходят с Oracle и SQL на Java-стек
Поддерживать старый код или шагнуть в продвинутое настоящее? Сложно, но можно, если все рассчитать. История перехода металлургического комбината на современный стек.
🔗 Основной сайт
🔗 Зеркало
Поддерживать старый код или шагнуть в продвинутое настоящее? Сложно, но можно, если все рассчитать. История перехода металлургического комбината на современный стек.
🔗 Основной сайт
🔗 Зеркало
#вопросы_с_собеседований
Чем отличаются JRE, JVM И JDK?
JRE кратко - для работы. Java Runtime Environment (сокр. JRE) - минимальная реализация виртуальной машины, необходимая для исполнения Java-приложений, без компилятора и других средств разработки. Состоит из виртуальной машины - Java Virtual Machine и библиотеки Java-классов.
JDK кратко - для программирования. Java Development Kit (сокращенно JDK) - бесплатно распространяемый компанией Oracle Corporation (ранее Sun Microsystems) комплект разработчика приложений на языке Java, включающий в себя компилятор Java (javac), стандартные библиотеки классов Java, примеры, документацию, различные утилиты и исполнительную систему Java (JRE).
Java Virtual Machine (сокращенно Java VM, JVM) - виртуальная машина Java - основная часть исполняющей системы Java, так называемой Java Runtime Environment (JRE). Виртуальная машина Java интерпретирует Байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java (javac). JVM может также использоваться для выполнения программ, написанных на других языках программирования.
Чем отличаются JRE, JVM И JDK?
JRE кратко - для работы. Java Runtime Environment (сокр. JRE) - минимальная реализация виртуальной машины, необходимая для исполнения Java-приложений, без компилятора и других средств разработки. Состоит из виртуальной машины - Java Virtual Machine и библиотеки Java-классов.
JDK кратко - для программирования. Java Development Kit (сокращенно JDK) - бесплатно распространяемый компанией Oracle Corporation (ранее Sun Microsystems) комплект разработчика приложений на языке Java, включающий в себя компилятор Java (javac), стандартные библиотеки классов Java, примеры, документацию, различные утилиты и исполнительную систему Java (JRE).
Java Virtual Machine (сокращенно Java VM, JVM) - виртуальная машина Java - основная часть исполняющей системы Java, так называемой Java Runtime Environment (JRE). Виртуальная машина Java интерпретирует Байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java (javac). JVM может также использоваться для выполнения программ, написанных на других языках программирования.
#вопросы_с_собеседований
Можно ли сделать основной поток программы демоном?
Можно ли сделать основной поток программы демоном?
Нет
. Потоки-демоны позволяют описывать фоновые процессы, которые нужны только для обслуживания основных потоков выполнения и не могут существовать без них.#вопросы_с_собеседований
Что значит «усыпить» поток?
Это значит приостановить его на определенный промежуток времени, вызвав в ходе его выполнения статический метод
Что значит «усыпить» поток?
Это значит приостановить его на определенный промежуток времени, вызвав в ходе его выполнения статический метод
Thread.sleep()
передав в качестве параметра необходимое количество времени в миллисекундах. До истечения этого времени поток может быть выведен из состояния ожидания вызовом interrupt()
с выбрасыванием InterruptedException
.Подготовка к интервью по Spring Data JPA
Одним из самых популярных модулей в приложениях Spring Boot является Spring Data JPA. Следовательно, у вас почти нет шансов избежать вопросов на собесе, связанных с этой темой. В этой статье будут рассмотрены наиболее часто задаваемые вопросы с подробными ответами по JPA/JDBC/Hibernate.
Читать статью
Одним из самых популярных модулей в приложениях Spring Boot является Spring Data JPA. Следовательно, у вас почти нет шансов избежать вопросов на собесе, связанных с этой темой. В этой статье будут рассмотрены наиболее часто задаваемые вопросы с подробными ответами по JPA/JDBC/Hibernate.
Читать статью
DZone
Spring Data JPA Interview Questions and Answers
Whether you are a junior or senior java developer, this article will help you to prepare for a job interview and improve your knowledge of Spring Data JPA.
💡 Как генерировать новые идеи: 7 творческих методик решения задач
Объясняем «на пальцах» алгоритмы семи творческих методик решения задач.
🔗 Основной сайт
🔗 Зеркало
Объясняем «на пальцах» алгоритмы семи творческих методик решения задач.
🔗 Основной сайт
🔗 Зеркало
#вопросы_с_собеседований
Чем отличаются два интерфейса Runnable и Callable?
• Интерфейс Runnable появился в Java 1.0, а интерфейс Callable был введен в Java 5.0 в составе библиотеки java.util.concurrent;
• Классы, реализующие интерфейс Runnable для выполнения задачи должны реализовывать метод run(). Классы, реализующие интерфейс Callable - метод call();
• Метод Runnable.run() не возвращает никакого значения, Callable.call() возвращает объект Future, который может содержать результат вычислений;
• Метод run() не может выбрасывать проверяемые исключения, в то время как метод call() может.
Чем отличаются два интерфейса Runnable и Callable?
• Интерфейс Runnable появился в Java 1.0, а интерфейс Callable был введен в Java 5.0 в составе библиотеки java.util.concurrent;
• Классы, реализующие интерфейс Runnable для выполнения задачи должны реализовывать метод run(). Классы, реализующие интерфейс Callable - метод call();
• Метод Runnable.run() не возвращает никакого значения, Callable.call() возвращает объект Future, который может содержать результат вычислений;
• Метод run() не может выбрасывать проверяемые исключения, в то время как метод call() может.
🧑🏼🏫 Ментор в IT: для чего нужен и как его выбрать
Отыскать действительно хорошего ментора – задача не из легких. Подскажем, по каким критериям его выбрать и как заинтересовать.
🔗 Основной сайт
🔗 Зеркало
Отыскать действительно хорошего ментора – задача не из легких. Подскажем, по каким критериям его выбрать и как заинтересовать.
🔗 Основной сайт
🔗 Зеркало
#вопросы_с_собеседований
Что такое FutureTask?
FutureTask представляет собой отменяемое асинхронное вычисление в параллельном Java приложении. Этот класс предоставляет базовую реализацию Future, с методами для запуска и остановки вычисления, методами для запроса состояния вычисления и извлечения результатов. Результат может быть получен только когда вычисление завершено, метод получения будет заблокирован, если вычисление ещё не завершено. Объекты FutureTask могут быть использованы для обёртки объектов Callable и Runnable. Так как FutureTask реализует Runnable, его можно передать в Executor на выполнение.
Что такое FutureTask?
FutureTask представляет собой отменяемое асинхронное вычисление в параллельном Java приложении. Этот класс предоставляет базовую реализацию Future, с методами для запуска и остановки вычисления, методами для запроса состояния вычисления и извлечения результатов. Результат может быть получен только когда вычисление завершено, метод получения будет заблокирован, если вычисление ещё не завершено. Объекты FutureTask могут быть использованы для обёртки объектов Callable и Runnable. Так как FutureTask реализует Runnable, его можно передать в Executor на выполнение.
#вопросы_с_собеседований
В чем заключаются различия между CyclicBarrier и CountDownLatch?
CountDownLatch (замок с обратным отсчетом) предоставляет возможность любому количеству потоков в блоке кода ожидать до тех пор, пока не завершится определенное количество операций, выполняющихся в других потоках, перед тем как они будут «отпущены», чтобы продолжить свою деятельность. В конструктор CountDownLatch(int count) обязательно передается количество операций, которое должно быть выполнено, чтобы замок «отпустил» заблокированные потоки.
Примером CountDownLatch из жизни может служить сбор экскурсионной группы: пока не наберется определенное количество человек, экскурсия не начнется.
CyclicBarrier реализует шаблон синхронизации «Барьер». Циклический барьер является точкой синхронизации, в которой указанное количество параллельных потоков встречается и блокируется. Как только все потоки прибыли, выполняется опционное действие (или не выполняется, если барьер был инициализирован без него), и, после того, как оно выполнено, барьер ломается и ожидающие потоки «освобождаются». В конструкторы барьера CyclicBarrier(int parties) и CyclicBarrier(int parties, Runnable barrierAction) обязательно передается количество сторон, которые должны «встретиться», и, опционально, действие, которое должно произойти, когда стороны встретились, но перед тем когда они будут «отпущены».
CyclicBarrier является альтернативой метода join(), который «собирает» потоки только после того, как они выполнились.
CyclicBarrier похож на CountDownLatch, но главное различие между ними в том, что использовать «замок» можно лишь единожды - после того, как его счётчик достигнет нуля, а «барьер» можно использовать неоднократно, даже после того, как он «сломается».
В чем заключаются различия между CyclicBarrier и CountDownLatch?
CountDownLatch (замок с обратным отсчетом) предоставляет возможность любому количеству потоков в блоке кода ожидать до тех пор, пока не завершится определенное количество операций, выполняющихся в других потоках, перед тем как они будут «отпущены», чтобы продолжить свою деятельность. В конструктор CountDownLatch(int count) обязательно передается количество операций, которое должно быть выполнено, чтобы замок «отпустил» заблокированные потоки.
Примером CountDownLatch из жизни может служить сбор экскурсионной группы: пока не наберется определенное количество человек, экскурсия не начнется.
CyclicBarrier реализует шаблон синхронизации «Барьер». Циклический барьер является точкой синхронизации, в которой указанное количество параллельных потоков встречается и блокируется. Как только все потоки прибыли, выполняется опционное действие (или не выполняется, если барьер был инициализирован без него), и, после того, как оно выполнено, барьер ломается и ожидающие потоки «освобождаются». В конструкторы барьера CyclicBarrier(int parties) и CyclicBarrier(int parties, Runnable barrierAction) обязательно передается количество сторон, которые должны «встретиться», и, опционально, действие, которое должно произойти, когда стороны встретились, но перед тем когда они будут «отпущены».
CyclicBarrier является альтернативой метода join(), который «собирает» потоки только после того, как они выполнились.
CyclicBarrier похож на CountDownLatch, но главное различие между ними в том, что использовать «замок» можно лишь единожды - после того, как его счётчик достигнет нуля, а «барьер» можно использовать неоднократно, даже после того, как он «сломается».