Библиотека джависта | Java, Spring, Maven, Hibernate
24.8K subscribers
1.88K photos
38 videos
42 files
2.66K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://yangx.top/proglibrary/9197

Для обратной связи: @proglibrary_feeedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
加入频道
Подготовка к интервью по Spring Data JPA

Одним из самых популярных модулей в приложениях Spring Boot является Spring Data JPA. Следовательно, у вас почти нет шансов избежать вопросов на собесе, связанных с этой темой. В этой статье будут рассмотрены наиболее часто задаваемые вопросы с подробными ответами по JPA/JDBC/Hibernate.

Читать статью
💡 Как генерировать новые идеи: 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() может.
🧑🏼‍🏫 Ментор в IT: для чего нужен и как его выбрать

Отыскать действительно хорошего ментора – задача не из легких. Подскажем, по каким критериям его выбрать и как заинтересовать.

🔗 Основной сайт
🔗 Зеркало
#вопросы_с_собеседований
Что такое 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, но главное различие между ними в том, что использовать «замок» можно лишь единожды - после того, как его счётчик достигнет нуля, а «барьер» можно использовать неоднократно, даже после того, как он «сломается».
Учебник по Java: введение в класс String

Оттачиваем навык работы со строчками: создание, форматирование, конкатенация строк и самые часто используемые методы.

https://proglib.io/sh/Va21eG9L4R

Зеркало: https://proglib.tech/p/uchebnik-po-java-vvedenie-v-klass-string-2022-08-26
#вопросы_с_собеседований
Существует ли способ решения проблемы race condition?

Распространённые способы решения:

Использование локальной копии — копирование разделяемой переменной в локальную переменную потока. Этот способ работает только тогда, когда переменная одна и копирование производится атомарно (за одну машинную команду), использование volatile.
Синхронизация - операции над разделяемым ресурсом происходят в синхронизированном блоке (при использовании ключевого слова synchronized).
Комбинирование методов - вышеперечисленные способы можно комбинировать, копируя «опасные» переменные в синхронизированном блоке. С одной стороны, это снимает ограничение на атомарность, с другой — позволяет избавиться от слишком больших синхронизированных блоков.

Очевидных способов выявления и исправления состояний гонки не существует. Лучший способ избавиться от гонок — правильное проектирование многозадачной системы.
Опрос «Библиотеки программиста»

Прошло почти полгода с момента нашего опроса «💬📈 Что сейчас происходит с IT-индустрией и айтишниками?». По версиям респондентов (более 700) IT-отрасль ждала волна сокращений, массовая релокация, наплыв стартапов и трудности с заменой железа и ПО на отечественные аналоги.

Общий прогноз звучал так: «Слишком много переменных, прогнозы от неутешительных до удовлетворительных»

Насколько оправдался этот прогноз? Как изменилась ваша жизнь за последние полгода?

➡️ Пройти опрос
Как написать свой первый автотест за 1 час?

Посетить открытое занятие курса "Автоматизация тестирования на Java" от ребят из школы автоматизации QA.GURU бесплатное открытое занятие состоится 7-го сентября в 20:00 МСК.

Почему надо сходить:
Для новичков:

— Разработаем ваш первый автотест на поиск в Google
—Расскажем о рынке QA. Кто, кому, за что и сколько платит?
— Дадим домашнее задание и проверим его у всех участников.
Для опытных:
— Расскажем про актуальный фреймворк на Java
— Покажем боевой проект с полной инфраструктурой (Web, API)
— Сессия вопросов и ответов с QA Lead

Занятие бесплатное — для участия вступайте в чат @qa_guru_chat — ссылка на занятие будет там.
#вопросы_с_собеседований
Как остановить поток?

На данный момент в Java принят уведомительный порядок остановки потока (хотя JDK 1.0 и имеет несколько управляющих выполнением потока методов, например stop(), suspend() и resume() - в следующих версиях JDK все они были помечены как deprecated из-за потенциальных угроз взаимной блокировки).

Для корректной остановки потока можно использовать метод класса Thread - interrupt(). Этот метод выставляет некоторый внутренний флаг-статус прерывания. В дальнейшем состояние этого флага можно проверить с помощью метода isInterrupted() или Thread.interrupted() (для текущего потока). Метод interrupt() также способен вывести поток из состояния ожидания или спячки. Т.е. если у потока были вызваны методы sleep() или wait() – текущее состояние прервется и будет выброшено исключение InterruptedException. Флаг в этом случае не выставляется.

Схема действия при этом получается следующей:

• Реализовать поток.
• В потоке периодически проводить проверку статуса прерывания через вызов isInterrupted().
• Если состояние флага изменилось или было выброшено исключение во время ожидания/спячки, следовательно поток пытаются остановить извне.
• Принять решение – продолжить работу (если по каким-то причинам остановиться невозможно) или освободить заблокированные потоком ресурсы и закончить выполнение.

Возможная проблема, которая присутствует в этом подходе – блокировки на потоковом вводе-выводе. Если поток заблокирован на чтении данных - вызов interrupt() из этого состояния его не выведет. Решения тут различаются в зависимости от типа источника данных. Если чтение идет из файла – долговременная блокировка крайне маловероятна и тогда можно просто дождаться выхода из метода read(). Если же чтение каким-то образом связано с сетью – стоит использовать неблокирующий ввод-вывод из Java NIO.

Второй вариант реализации метода остановки (а также и приостановки) – сделать собственный аналог interrupt(). Т.е. объявить в классе потока флаги – на остановку и/или приостановку и выставлять их путем вызова заранее определённых методов извне. Методика действия при этом остаётся прежней – проверять установку флагов и принимать решения при их изменении. Недостатки такого подхода. Во-первых, потоки в состоянии ожидания таким способом не «оживить». Во-вторых, выставление флага одним потоком совсем не означает, что второй поток тут же его увидит. Для увеличения производительности виртуальная машина использует кеш данных потока, в результате чего обновление переменной у второго потока может произойти через неопределенный промежуток времени (хотя допустимым решением будет объявить переменную-флаг как volatile).
#вопросы_с_собеседований
Что происходит, когда в потоке выбрасывается исключение?

• Если исключение не поймано – поток «умирает» (переходит в состяние мёртв (dead)).
• Если установлен обработчик непойманных исключений, то он возьмёт управление на себя. Thread.UncaughtExceptionHandler – интерфейс, определённый как вложенный интерфейс для других обработчиков, вызываемых, когда поток внезапно останавливается из-за непойманного исключения. В случае, если поток собирается остановиться из-за непойманного исключения, JVM проверяет его на наличие UncaughtExceptionHandler, используя Thread.getUncaughtExceptionHandler(), и если такой обработчик найдет, то вызовет у него метод uncaughtException(), передав этот поток и исключение в виде аргументов.
#вопросы_с_собеседований
В чем разница между interrupted() и isInterrupted()?

Механизм прерывания работы потока в Java реализован с использованием внутреннего флага, известного как статус прерывания. Прерывание потока вызовом Thread.interrupt() устанавливает этот флаг. Методы Thread.interrupted() и isInterrupted() позволяют проверить, является ли поток прерванным.

Когда прерванный поток проверяет статус прерывания, вызывая статический метод Thread.interrupted(), статус прерывания сбрасывается.

Нестатический метод isInterrupted() используется одним потоком для проверки статуса прерывания у другого потока, не изменяя флаг прерывания.
Зачем использовать функциональное программирование, если есть ООП?

Легко писать, легко отлаживать и использовать повторно. Правда ли это? Давайте разбираться.

https://proglib.io/sh/ygPOrh7i8C