#вопросы_с_собеседований
Какого размера должен быть пул потоков?
Настраивая размер пула потоков, важно избежать двух ошибок: слишком мало потоков (очередь на выполнение будет расти, потребляя много памяти) или слишком много потоков (замедление работы всей систему из-за частых переключений контекста).
Оптимальный размер пула потоков зависит от количества доступных процессоров и природы задач в рабочей очереди. На
Использование процессора – не единственный фактор, важный при настройке размера пула потоков. По мере возрастания пула потоков, можно столкнуться с ограничениями планировщика, доступной памяти, или других системных ресурсов, таких, как количество сокетов, дескрипторы открытого файла, или каналы связи базы данных.
Какого размера должен быть пул потоков?
Настраивая размер пула потоков, важно избежать двух ошибок: слишком мало потоков (очередь на выполнение будет расти, потребляя много памяти) или слишком много потоков (замедление работы всей систему из-за частых переключений контекста).
Оптимальный размер пула потоков зависит от количества доступных процессоров и природы задач в рабочей очереди. На
N-процессорной
системе для рабочей очереди, которая будет выполнять исключительно задачи с ограничением по скорости вычислений, можно достигнуть максимального использования CPU
с пулом потоков, в котором содержится N
или N+1
поток. Для задач, которые могут ждать осуществления I/O
(ввода - вывода) - например, задачи, считывающей HTTP-запрос
из сокета – может понадобиться увеличение размера пула свыше количества доступных процессоров, потому, что не все потоки будут работать все время. Используя профилирование, можно оценить отношение времени ожидания (WT
) ко времени обработки (ST
) для типичного запроса. Если назвать это соотношение WT/ST
, то для N-процессорной
системе понадобится примерно N*(1 + WT/ST)
потоков для полной загруженности процессоров.Использование процессора – не единственный фактор, важный при настройке размера пула потоков. По мере возрастания пула потоков, можно столкнуться с ограничениями планировщика, доступной памяти, или других системных ресурсов, таких, как количество сокетов, дескрипторы открытого файла, или каналы связи базы данных.
Что будет, если очередь пула потоков уже заполнена, но подаётся новая задача?
Если очередь пула потоков заполнилась, то поданная задача будет «отклонена». Например - метод submit() у ThreadPoolExecutor выкидывает RejectedExecutionException, после которого вызывается RejectedExecutionHandler.
Если очередь пула потоков заполнилась, то поданная задача будет «отклонена». Например - метод submit() у ThreadPoolExecutor выкидывает RejectedExecutionException, после которого вызывается RejectedExecutionHandler.
«Библиотека программиста» находится в поиске авторов оригинальных статей
Языки:
– Python, JavaScript, TypeScript, Java, C#, Go, SQL.
Тематики:
– Информационная безопасность, Data Science, базовые концепции языков, продвинутый Python, JS (и т. д), бэкенд веб-приложений, фронтенд-разработка, React, системное программирование, базы данных.
Объем:
– от 7 до 15 тыс. знаков.
➡️ Заполнить анкету ⬅️
Я хорошо программирую, но пишу «так себе». Что делать?
Если вы хорошо программируете, но навыки письма немного отстают, пройдите наш бесплатный курс на Степике «Статьи для IT: как объяснять и распространять значимые идеи».
Языки:
– Python, JavaScript, TypeScript, Java, C#, Go, SQL.
Тематики:
– Информационная безопасность, Data Science, базовые концепции языков, продвинутый Python, JS (и т. д), бэкенд веб-приложений, фронтенд-разработка, React, системное программирование, базы данных.
Объем:
– от 7 до 15 тыс. знаков.
➡️ Заполнить анкету ⬅️
Я хорошо программирую, но пишу «так себе». Что делать?
Если вы хорошо программируете, но навыки письма немного отстают, пройдите наш бесплатный курс на Степике «Статьи для IT: как объяснять и распространять значимые идеи».
В чём заключается различие между методами submit() и execute() у пула потоков?
Оба метода являются способами подачи задачи в пул потоков, но между ними есть небольшая разница.
execute(Runnable command) определён в интерфейсе Executor и выполняет поданную задачу и ничего не возвращает.
submit() – перегруженный метод, определённый в интерфейсе ExecutorService. Способен принимать задачи типов Runnable и Callable и возвращать объект Future, который можно использовать для контроля и управления процессом выполнения, получения его результата.
Оба метода являются способами подачи задачи в пул потоков, но между ними есть небольшая разница.
execute(Runnable command) определён в интерфейсе Executor и выполняет поданную задачу и ничего не возвращает.
submit() – перегруженный метод, определённый в интерфейсе ExecutorService. Способен принимать задачи типов Runnable и Callable и возвращать объект Future, который можно использовать для контроля и управления процессом выполнения, получения его результата.
#вопросы_с_собеседований
Для чего нужны функциональные интерфейсы вида _To_Function?
DoubleToIntFunction - операция, принимающая аргумент класса Double и возвращающая результат типа Integer;
DoubleToLongFunction - операция, принимающая аргумент класса Double и возвращающая результат типа Long;
IntToDoubleFunction - операция, принимающая аргумент класса Integer и возвращающая результат типа Double;
IntToLongFunction - операция, принимающая аргумент класса Integer и возвращающая результат типа Long;
LongToDoubleFunction - операция, принимающая аргумент класса Long и возвращающая результат типа Double;
LongToIntFunction - операция, принимающая аргумент класса Long и возвращающая результат типа Integer.
Для чего нужны функциональные интерфейсы вида _To_Function?
DoubleToIntFunction - операция, принимающая аргумент класса Double и возвращающая результат типа Integer;
DoubleToLongFunction - операция, принимающая аргумент класса Double и возвращающая результат типа Long;
IntToDoubleFunction - операция, принимающая аргумент класса Integer и возвращающая результат типа Double;
IntToLongFunction - операция, принимающая аргумент класса Integer и возвращающая результат типа Long;
LongToDoubleFunction - операция, принимающая аргумент класса Long и возвращающая результат типа Double;
LongToIntFunction - операция, принимающая аргумент класса Long и возвращающая результат типа Integer.
В чем заключаются различия между cтеком (stack) и кучей (heap) с точки зрения многопоточности?
Cтек
– участок памяти, тесно связанный с потоками. У каждого потока есть свой стек, которые хранит локальные переменные, параметры методов и стек вызовов. Переменная, хранящаяся в стеке одного потока, не видна для другого.Куча
– общий участок памяти, который делится между всеми потоками. Объекты, неважно локальные или любого другого уровня, создаются в куче. Для улучшения производительности, поток обычно кэширует значения из кучи в свой стек, в этом случае для того, чтобы указать потоку, что переменную следует читать из кучи используется ключевое слово volatile.🧬 «В здоровом теле…»: 7 мифов о биохакинге
Как прожить дольше и правда ли что людей будут чипировать? Рассказываем о самых известных заблуждениях, касающихся биохакинга.
🔗 Основной сайт
🔗 Зеркало
Как прожить дольше и правда ли что людей будут чипировать? Рассказываем о самых известных заблуждениях, касающихся биохакинга.
🔗 Основной сайт
🔗 Зеркало
#вопросы_с_собеседований
При помощи чего формируются запросы к базе данных?
Для выполнения запросов к базе данных в Java используются три интерфейса:
☕️ java.sql.Statement - для операторов SQL без параметров;
☕️ java.sql.PreparedStatement - для операторов SQL с параметрами и часто выполняемых операторов;
☕️ java.sql.CallableStatement - для исполнения хранимых в базе процедур.
Объекты-носители интерфейсов создаются при помощи методов объекта java.sql.Connection:
☕️ java.sql.createStatement() возвращает объект Statement;
☕️ java.sql.prepareStatement() возвращает объект PreparedStatement;
☕️ java.sql.prepareCall() возвращает объект CallableStatement;
При помощи чего формируются запросы к базе данных?
Для выполнения запросов к базе данных в Java используются три интерфейса:
☕️ java.sql.Statement - для операторов SQL без параметров;
☕️ java.sql.PreparedStatement - для операторов SQL с параметрами и часто выполняемых операторов;
☕️ java.sql.CallableStatement - для исполнения хранимых в базе процедур.
Объекты-носители интерфейсов создаются при помощи методов объекта java.sql.Connection:
☕️ java.sql.createStatement() возвращает объект Statement;
☕️ java.sql.prepareStatement() возвращает объект PreparedStatement;
☕️ java.sql.prepareCall() возвращает объект CallableStatement;
Отличия String/StringBuilder/StringBuffer
• String — иммутабельный байтовый массив
• StringBuilder — helper-класс для построения строк, не предоставляет гарантий синхронизации
• StringBuffer — то же, что и StringBuilder, с synchronized методами
• String — иммутабельный байтовый массив
• StringBuilder — helper-класс для построения строк, не предоставляет гарантий синхронизации
• StringBuffer — то же, что и StringBuilder, с synchronized методами
#вопросы_с_собеседований
Какой параметр запуска JVM используется для контроля размера стека потока?
Какой параметр запуска JVM используется для контроля размера стека потока?
-Xss
#вопросы_с_собеседований
Какие различные методы управления сессией в сервлетах вы знаете?
При посещении клиентом Web-ресурса и выполнении вариантов запросов, контекстная информация о клиенте не хранится. В протоколе HTTP нет возможностей для сохранения и изменения информации о предыдущих посещениях клиента. Сеанс (сессия) – соединение между клиентом и сервером, устанавливаемое на определенное время, за которое клиент может отправить на сервер сколько угодно запросов. Сеанс устанавливается непосредственно между клиентом и Web-сервером. Каждый клиент устанавливает с сервером свой собственный сеанс. Сеансы используются для обеспечения хранения данных во время нескольких запросов Web-страницы или на обработку информации, введенной в пользовательскую форму в результате нескольких HTTP-соединений (например, клиент совершает несколько покупок в интернет-магазине; студент отвечает на несколько тестов в системе дистанционного обучения).
Существует несколько способов обеспечения уникального идентификатора сессии:
User Authentication – Предоставление учетных данных самим пользователем в момент аутентификации. Переданная таким образом информация в дальнейшем используется для поддержания сеанса. Это метод не будет работать, если пользователь вошёл в систему одновременно из нескольких мест.
HTML Hidden Field – Присвоение уникального значения скрытому полю HTML страницы, в момент когда пользователь начинает сеанс. Этот метод не может быть использован со ссылками, потому что нуждается в подтверждении формы со скрытым полем каждый раз во время формирования запроса. Кроме того, это не безопасно, т.к. существует возможность простой подмены такого идентификатора.
URL Rewriting – Добавление идентификатора сеанса как параметра URL. Достаточно утомительная операция, потому что требует постоянного отслеживания этого идентификатора при каждом запросе или ответе.
Cookies – Использование небольших фрагментов данных, отправленных web-сервером и хранимых на устройстве пользователя. Данный метод не будет работать, если клиент отключает использование cookies.
Session Management API – Использование специального API для отслеживания сеанса, построенный на основе и на методах, описанных выше и который решает частные проблемы перечисленных способов:
Чаще всего недостаточно просто отслеживать сессию, необходимо ещё и сохранять какие-либо дополнительные данные о ней, которые могут потребоваться при обработке последующих запросов. Осуществление такого поведения требует много дополнительных усилий.
Все вышеперечисленные методы не являются универсальными: для каждого из них можно подобрать конкретный сценарий, при котором они не будут работать.
Какие различные методы управления сессией в сервлетах вы знаете?
При посещении клиентом Web-ресурса и выполнении вариантов запросов, контекстная информация о клиенте не хранится. В протоколе HTTP нет возможностей для сохранения и изменения информации о предыдущих посещениях клиента. Сеанс (сессия) – соединение между клиентом и сервером, устанавливаемое на определенное время, за которое клиент может отправить на сервер сколько угодно запросов. Сеанс устанавливается непосредственно между клиентом и Web-сервером. Каждый клиент устанавливает с сервером свой собственный сеанс. Сеансы используются для обеспечения хранения данных во время нескольких запросов Web-страницы или на обработку информации, введенной в пользовательскую форму в результате нескольких HTTP-соединений (например, клиент совершает несколько покупок в интернет-магазине; студент отвечает на несколько тестов в системе дистанционного обучения).
Существует несколько способов обеспечения уникального идентификатора сессии:
User Authentication – Предоставление учетных данных самим пользователем в момент аутентификации. Переданная таким образом информация в дальнейшем используется для поддержания сеанса. Это метод не будет работать, если пользователь вошёл в систему одновременно из нескольких мест.
HTML Hidden Field – Присвоение уникального значения скрытому полю HTML страницы, в момент когда пользователь начинает сеанс. Этот метод не может быть использован со ссылками, потому что нуждается в подтверждении формы со скрытым полем каждый раз во время формирования запроса. Кроме того, это не безопасно, т.к. существует возможность простой подмены такого идентификатора.
URL Rewriting – Добавление идентификатора сеанса как параметра URL. Достаточно утомительная операция, потому что требует постоянного отслеживания этого идентификатора при каждом запросе или ответе.
Cookies – Использование небольших фрагментов данных, отправленных web-сервером и хранимых на устройстве пользователя. Данный метод не будет работать, если клиент отключает использование cookies.
Session Management API – Использование специального API для отслеживания сеанса, построенный на основе и на методах, описанных выше и который решает частные проблемы перечисленных способов:
Чаще всего недостаточно просто отслеживать сессию, необходимо ещё и сохранять какие-либо дополнительные данные о ней, которые могут потребоваться при обработке последующих запросов. Осуществление такого поведения требует много дополнительных усилий.
Все вышеперечисленные методы не являются универсальными: для каждого из них можно подобрать конкретный сценарий, при котором они не будут работать.
#вопросы_с_собеседований
Какие методы для работы с cookies предусмотрены в сервлетах?
Servlet API предоставляет поддержку cookies через класс javax.servlet.http.Cookie:
• Для получения массива cookies из запроса необходимо воспользоваться методом HttpServletRequest.getCookies(). Методов для добавления cookies в HttpServletRequest не предусмотрено.
• Для добавления cookie в ответ используется HttpServletResponse.addCookie(Cookie c). Метода получения cookies в HttpServletResponse отсутствует.
Какие методы для работы с cookies предусмотрены в сервлетах?
Servlet API предоставляет поддержку cookies через класс javax.servlet.http.Cookie:
• Для получения массива cookies из запроса необходимо воспользоваться методом HttpServletRequest.getCookies(). Методов для добавления cookies в HttpServletRequest не предусмотрено.
• Для добавления cookie в ответ используется HttpServletResponse.addCookie(Cookie c). Метода получения cookies в HttpServletResponse отсутствует.
#ищу_работу
Напишите пару слов о себе, добавьте ссылку на гитхаб/резюме и укажите хештеги: #язык, #стек, #библиотеки
Напишите пару слов о себе, добавьте ссылку на гитхаб/резюме и укажите хештеги: #язык, #стек, #библиотеки
👨🎓 31 лучший вуз России для будущих программистов 2022-2023
Составили список из 31 вуза, где вы научитесь думать как программист и получите фундаментальные знания в области математики, информатики, компьютерных наук и так далее. Для удобства вузы отсортированы по среднему проходному баллу ЕГЭ: от наибольшего к наименьшему.
🔗 Основной сайт
🔗 Зеркало
Составили список из 31 вуза, где вы научитесь думать как программист и получите фундаментальные знания в области математики, информатики, компьютерных наук и так далее. Для удобства вузы отсортированы по среднему проходному баллу ЕГЭ: от наибольшего к наименьшему.
🔗 Основной сайт
🔗 Зеркало
#вопросы_с_собеседований
Что такое «фреймворк Fork/Join»?
Фреймворк
• Этап
• Этап
Решение всех подзадач (в т.ч. и само разбиение на подзадачи) происходит параллельно.
Для решения некоторых задач этап Join не требуется. Например, для параллельного
Ещё одно замечательное преимущество этого фреймворка заключается в том, что он использует
Что такое «фреймворк Fork/Join»?
Фреймворк
Fork/Join
, представленный в JDK 7
, - это набор классов и интерфейсов позволяющих использовать преимущества многопроцессорной архитектуры современных компьютеров. Он разработан для выполнения задач, которые можно рекурсивно разбить на маленькие подзадачи, которые можно решать параллельно.• Этап
Fork
: большая задача разделяется на несколько меньших подзадач, которые в свою очередь также разбиваются на меньшие. И так до тех пор, пока задача не становится тривиальной и решаемой последовательным способом.• Этап
Join
: далее (опционально) идёт процесс «свёртки» - решения подзадач некоторым образом объединяются пока не получится решение всей задачи.Решение всех подзадач (в т.ч. и само разбиение на подзадачи) происходит параллельно.
Для решения некоторых задач этап Join не требуется. Например, для параллельного
QuickSort
— массив рекурсивно делится на всё меньшие и меньшие диапазоны, пока не вырождается в тривиальный случай из 1 элемента. Хотя в некотором смысле Join
будет необходим и тут, т.к. всё равно остаётся необходимость дождаться пока не закончится выполнение всех подзадач.Ещё одно замечательное преимущество этого фреймворка заключается в том, что он использует
work-stealing
алгоритм: потоки, которые завершили выполнение собственных подзадач, могут «украсть» подзадачи у других потоков, которые всё ещё заняты.💡Сколько курсов вы купили и не стали проходить? ⬇️
Расскажите в комментариях ⬇️
Расскажите в комментариях ⬇️
#вопросы_с_собеседований
Что такое Semaphore?
Что такое Semaphore?
Semaphore
– это новый тип синхронизатора: семафор со счётчиком, реализующий шаблон синхронизации Семафор. Доступ управляется с помощью счётчика: изначальное значение счётчика задаётся в конструкторе при создании синхронизатора, когда поток заходит в заданный блок кода, то значение счётчика уменьшается на единицу, когда поток его покидает, то увеличивается. Если значение счётчика равно нулю, то текущий поток блокируется, пока кто-нибудь не выйдет из защищаемого блока. Semaphore
используется для защиты дорогих ресурсов, которые доступны в ограниченном количестве, например подключение к базе данных в пуле.#вопросы_с_собеседований
override vs overload
• override — возможность переопределениия поведения метода в типах-потомках
• overload — возможность переопределять метод с одним именем, но разным набором аргументов
override vs overload
• override — возможность переопределениия поведения метода в типах-потомках
• overload — возможность переопределять метод с одним именем, но разным набором аргументов
#вопросы_с_собеседований
Чем полезны неизменяемые объекты?
Неизменяемость (
Чем полезны неизменяемые объекты?
Неизменяемость (
immutability
) помогает облегчить написание многопоточного кода. Неизменяемый объект может быть использован без какой-либо синхронизации. К сожалению, в Java
нет аннотации @Immutable
, которая делает объект неизменяемым, для этого разработчикам нужно самим создавать класс с необходимыми характеристиками. Для этого необходимо следовать некоторым общим принципам: инициализация всех полей только в конструкторе, отсутствие методов setX()
вносящих изменения в поля класса, отсутствие утечек ссылки, организация отдельного хранилища копий изменяемых объектов и т.д.#вопросы_с_собеседований
Зачем добавили ArrayList, если уже был Vector?
☕️ Методы класса Vector синхронизированы, а ArrayList - нет;
☕️ По умолчанию Vector удваивает свой размер, когда заканчивается выделенная под элементы память. ArrayList же увеличивает свой размер только на половину.
Vector это устаревший класс и его использование не рекомендовано.
Зачем добавили ArrayList, если уже был Vector?
☕️ Методы класса Vector синхронизированы, а ArrayList - нет;
☕️ По умолчанию Vector удваивает свой размер, когда заканчивается выделенная под элементы память. ArrayList же увеличивает свой размер только на половину.
Vector это устаревший класс и его использование не рекомендовано.