При написании многопоточных программ следует придерживаться определённых правил, которые помогают обеспечить достойную производительность приложения в сочетании с удобной отладкой и простотой дальнейшей поддержки кода.
☕️ Всегда давайте значимые имена своим потокам. Процесс отладки, нахождения ошибок или отслеживание исключения в многопоточном коде – довольно сложная задача. OrderProcessor, QuoteProcessor или TradeProcessor намного информативнее, чем Thread1, Thread2 и Thread3. Имя должно отражать задачу, выполняемую данным потоком.
☕️ Избегайте блокировок или старайтесь уменьшить масштабы синхронизации. Блокировка затратна, а переключение контекста ещё более ресурсоёмко. Пытайтесь избегать синхронизации и блокировки насколько это возможно, и организуйте критическую секцию в минимально необходимом объёме. Поэтому синхронизированный блок всегда предпочительней синхронизированного метода, дополнительно наделяя возможностью абсолютного контроля над масштабом блокировки.
☕️ Обрабатывайте прерывание потока с особой тщательностью. Нет ничего хуже оставшегося заблокированным ресурса или системы в неконстистентном, по причине неподтверждённой транзакции, состоянии.
☕️ Помните об обработке исключений. Выброшенные InterruptedException должны быть адекватно обработаны, а не просто подавлены. Так же не стоит пренебрегать Thread.UncaughtExceptionHandler. При использовании пула потоков необходимо помнить, что он зачастую просто «проглатывает» исключения. Так, если вы отправили на выполнение Runnable нужно обязательно поместить код выполнения задачи внутрь блока try-catch. Если в очередь пула помещается Callable, необходимо удостоверится, что результат выполнения всегда изымается с помощью блокирующего get(), чтобы в случае возникновения существовала возможность заново выбросить произошедшее исключение.
☕️ Почти всегда использование Concurrent сollection выгоднее использования Synchronized сollection, т.к. первые более современны (используют все доступные на момент их написания новшества языка) и масштабируемы, чем их синхронизированные аналоги.
☕️ Всегда давайте значимые имена своим потокам. Процесс отладки, нахождения ошибок или отслеживание исключения в многопоточном коде – довольно сложная задача. OrderProcessor, QuoteProcessor или TradeProcessor намного информативнее, чем Thread1, Thread2 и Thread3. Имя должно отражать задачу, выполняемую данным потоком.
☕️ Избегайте блокировок или старайтесь уменьшить масштабы синхронизации. Блокировка затратна, а переключение контекста ещё более ресурсоёмко. Пытайтесь избегать синхронизации и блокировки насколько это возможно, и организуйте критическую секцию в минимально необходимом объёме. Поэтому синхронизированный блок всегда предпочительней синхронизированного метода, дополнительно наделяя возможностью абсолютного контроля над масштабом блокировки.
☕️ Обрабатывайте прерывание потока с особой тщательностью. Нет ничего хуже оставшегося заблокированным ресурса или системы в неконстистентном, по причине неподтверждённой транзакции, состоянии.
☕️ Помните об обработке исключений. Выброшенные InterruptedException должны быть адекватно обработаны, а не просто подавлены. Так же не стоит пренебрегать Thread.UncaughtExceptionHandler. При использовании пула потоков необходимо помнить, что он зачастую просто «проглатывает» исключения. Так, если вы отправили на выполнение Runnable нужно обязательно поместить код выполнения задачи внутрь блока try-catch. Если в очередь пула помещается Callable, необходимо удостоверится, что результат выполнения всегда изымается с помощью блокирующего get(), чтобы в случае возникновения существовала возможность заново выбросить произошедшее исключение.
☕️ Почти всегда использование Concurrent сollection выгоднее использования Synchronized сollection, т.к. первые более современны (используют все доступные на момент их написания новшества языка) и масштабируемы, чем их синхронизированные аналоги.
#вопросы_с_собеседований
Опишите, как обрабатываются JSP страницы, начиная от запроса к серверу, заканчивая ответом пользователю.
Опишите, как обрабатываются JSP страницы, начиная от запроса к серверу, заканчивая ответом пользователю.
Когда пользователь переходит по ссылке на страницу page.jsp, он отправляет http-запрос на сервер GET /page.jsp. Затем на основе этого запроса и текста самой страницы сервер генерирует java-класс, компилирует его и выполняет полученный сервлет, формирующий ответ пользователю в виде представления этой страницы, который сервер и перенаправляет обратно пользователю.
#вопросы_с_собеседований
Чем отличается работа метода wait() с параметром и без параметра?
Чем отличается работа метода wait() с параметром и без параметра?
wait() без параметров освобождает монитор и переводит вызывающий поток в состояние ожидания до тех пор, пока другой поток не вызовет метод notify()/ notifyAll(),
с параметрами заставит поток ожидать заданное количество времени или вызова notify()/ notifyAll().
с параметрами заставит поток ожидать заданное количество времени или вызова notify()/ notifyAll().
#вопросы_с_собеседований
Что происходит, когда в потоке выбрасывается исключение?
Что происходит, когда в потоке выбрасывается исключение?
☕️ Если исключение не поймано – поток «умирает» (переходит в состяние мёртв (dead)).
☕️ Если установлен обработчик непойманных исключений, то он возьмёт управление на себя. Thread.UncaughtExceptionHandler – интерфейс, определённый как вложенный интерфейс для других обработчиков, вызываемых, когда поток внезапно останавливается из-за непойманного исключения. В случае, если поток собирается остановиться из-за непойманного исключения, JVM проверяет его на наличие UncaughtExceptionHandler, используя Thread.getUncaughtExceptionHandler(), и если такой обработчик найдет, то вызовет у него метод uncaughtException(), передав этот поток и исключение в виде аргументов.
☕️ Если установлен обработчик непойманных исключений, то он возьмёт управление на себя. Thread.UncaughtExceptionHandler – интерфейс, определённый как вложенный интерфейс для других обработчиков, вызываемых, когда поток внезапно останавливается из-за непойманного исключения. В случае, если поток собирается остановиться из-за непойманного исключения, JVM проверяет его на наличие UncaughtExceptionHandler, используя Thread.getUncaughtExceptionHandler(), и если такой обработчик найдет, то вызовет у него метод uncaughtException(), передав этот поток и исключение в виде аргументов.
Hands-On Microservices with Kotlin (2018)
Автор: Juan Antonio Medina Iglesias
Количество страниц: 416
Эта книга поможет читателю разрабатывать и внедрять сервисы, а также создавать готовый к работе, тестируемый, экономичный код, который короче и проще, чем традиционная реализация на Java. Воспользуйтесь преимуществами реактивной парадигмы и неблокирующих технологий, чтобы вывести свои навыки на новый уровень с точки зрения отраслевых стандартов.
Скачать книгу
Автор: Juan Antonio Medina Iglesias
Количество страниц: 416
Эта книга поможет читателю разрабатывать и внедрять сервисы, а также создавать готовый к работе, тестируемый, экономичный код, который короче и проще, чем традиционная реализация на Java. Воспользуйтесь преимуществами реактивной парадигмы и неблокирующих технологий, чтобы вывести свои навыки на новый уровень с точки зрения отраслевых стандартов.
Скачать книгу
Telegram
Книги для программистов (reserved)
Hands-On Microservices with Kotlin (2018)
Автор: Juan Antonio Medina Iglesias
Автор: Juan Antonio Medina Iglesias
💻 30 лучших ноутбуков для программиста в 2020 году
Выбираем в разных ценовых диапазонах самые автономные, легкие, производительные и большие ноутбуки для кодинга. Спойлер: до 30 тысяч достойных кандидатов нет.
https://proglib.io/sh/UxDQ6z0Iqa
Выбираем в разных ценовых диапазонах самые автономные, легкие, производительные и большие ноутбуки для кодинга. Спойлер: до 30 тысяч достойных кандидатов нет.
https://proglib.io/sh/UxDQ6z0Iqa
#вопросы_с_собеседований
Дайте определение понятию «синхронизация».
Дайте определение понятию «синхронизация».
Синхронизация - это процесс, который позволяет выполнять потоки параллельно.
В Java все объекты имеют одну блокировку, благодаря которой только один поток одновременно может получить доступ к критическому коду в объекте. Такая синхронизация помогает предотвратить повреждение состояния объекта. Если поток получил блокировку, ни один другой поток не может войти в синхронизированный код, пока блокировка не будет снята. Когда поток, владеющий блокировкой, выходит из синхронизированного кода, блокировка снимается. Теперь другой поток может получить блокировку объекта и выполнить синхронизированный код. Если поток пытается получить блокировку объекта, когда другой поток владеет блокировкой, поток переходит в состояние Блокировки до тех пор, пока блокировка не снимется.
В Java все объекты имеют одну блокировку, благодаря которой только один поток одновременно может получить доступ к критическому коду в объекте. Такая синхронизация помогает предотвратить повреждение состояния объекта. Если поток получил блокировку, ни один другой поток не может войти в синхронизированный код, пока блокировка не будет снята. Когда поток, владеющий блокировкой, выходит из синхронизированного кода, блокировка снимается. Теперь другой поток может получить блокировку объекта и выполнить синхронизированный код. Если поток пытается получить блокировку объекта, когда другой поток владеет блокировкой, поток переходит в состояние Блокировки до тех пор, пока блокировка не снимется.
#вопросы_с_собеседований
Каким образом можно получить синхронизированные объекты стандартных коллекций?
Каким образом можно получить синхронизированные объекты стандартных коллекций?
С помощью статических методов synchronizedMap() и synchronizedList() класса Collections. Данные методы возвращают синхронизированный декоратор переданной коллекции. При этом все равно в случае обхода по коллекции требуется ручная синхронизация.
Map m = Collections.synchronizedMap(new HashMap());
List l = Collections.synchronizedList(new ArrayList());
Начиная с Java 6 JCF был расширен специальными коллекциями, поддерживающими многопоточный доступ, такими как CopyOnWriteArrayList и ConcurrentHashMap.
Map m = Collections.synchronizedMap(new HashMap());
List l = Collections.synchronizedList(new ArrayList());
Начиная с Java 6 JCF был расширен специальными коллекциями, поддерживающими многопоточный доступ, такими как CopyOnWriteArrayList и ConcurrentHashMap.
#вопросы_с_собеседований
Какие методы класса File вы знаете?
Какие методы класса File вы знаете?
18 ноября в 18:30 пройдет онлайн-митап для студентов и недавних выпускников – Deutsche Bank Junior IT Meetup.
Хотите подготовиться к старту карьеры на стыке IT и финансов?
Подключайтесь к трансляции и вы узнаете:
— какая профессия подойдет вам и как сделать первые шаги на пути к успешной карьере,
— как пройти отбор на программу для выпускников или летнюю стажировку в Технологическом Центре Дойче Банка: что нужно знать перед тестированием и интервью,
— с какими задачами сталкиваются начинающие разработчики и тестировщики в Технологическом Центре.
Регистрируйтесь на мероприятие на TimePad, чтобы получить ссылку на трансляцию: https://deutschebanktech.timepad.ru/event/1472760
Хотите подготовиться к старту карьеры на стыке IT и финансов?
Подключайтесь к трансляции и вы узнаете:
— какая профессия подойдет вам и как сделать первые шаги на пути к успешной карьере,
— как пройти отбор на программу для выпускников или летнюю стажировку в Технологическом Центре Дойче Банка: что нужно знать перед тестированием и интервью,
— с какими задачами сталкиваются начинающие разработчики и тестировщики в Технологическом Центре.
Регистрируйтесь на мероприятие на TimePad, чтобы получить ссылку на трансляцию: https://deutschebanktech.timepad.ru/event/1472760
Наиболее используемые методы класса File:
☕️ boolean createNewFile(): делает попытку создать новый файл;
☕️ boolean delete(): делает попытку удалить каталог или файл;
☕️ boolean mkdir(): делает попытку создать новый каталог;
☕️ boolean renameTo(File dest): делает попытку переименовать файл или каталог;
☕️ boolean exists(): проверяет, существует ли файл или каталог;
☕️ String getAbsolutePath(): возвращает абсолютный путь для пути, переданного в конструктор объекта;
☕️ String getName(): возвращает краткое имя файла или каталога;
☕️ String getParent(): возвращает имя родительского каталога;
☕️ boolean isDirectory(): возвращает значение true, если по указанному пути располагается каталог;
☕️ boolean isFile(): возвращает значение true, если по указанному пути находится файл;
☕️ boolean isHidden(): возвращает значение true, если каталог или файл являются скрытыми;
☕️ long length(): возвращает размер файла в байтах;
☕️ long lastModified(): возвращает время последнего изменения файла или каталога;
☕️ String[] list(): возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге;
☕️ File[] listFiles(): возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге.
☕️ boolean createNewFile(): делает попытку создать новый файл;
☕️ boolean delete(): делает попытку удалить каталог или файл;
☕️ boolean mkdir(): делает попытку создать новый каталог;
☕️ boolean renameTo(File dest): делает попытку переименовать файл или каталог;
☕️ boolean exists(): проверяет, существует ли файл или каталог;
☕️ String getAbsolutePath(): возвращает абсолютный путь для пути, переданного в конструктор объекта;
☕️ String getName(): возвращает краткое имя файла или каталога;
☕️ String getParent(): возвращает имя родительского каталога;
☕️ boolean isDirectory(): возвращает значение true, если по указанному пути располагается каталог;
☕️ boolean isFile(): возвращает значение true, если по указанному пути находится файл;
☕️ boolean isHidden(): возвращает значение true, если каталог или файл являются скрытыми;
☕️ long length(): возвращает размер файла в байтах;
☕️ long lastModified(): возвращает время последнего изменения файла или каталога;
☕️ String[] list(): возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге;
☕️ File[] listFiles(): возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге.
Forwarded from Java jobs — вакансии для java-разработчиков
AGIMA (крупнейший интегратор digital‑решений) ищет классного Technical Lead (Java)
https://www.agima.ru/
Мы создаем веб-сервисы и мобильные приложения для бизнеса на основе данных и здравого смысла.
Уровень: senior
Основные требования:
— Опыт: java разработчик от 5 лет и 1 год опыт тимлида
— Java, Spring boot, mongo
— Опыт работы с Magnolia CMS (будет большим плюсом)
— Приветствуется опыт работы с другими CMS
— Git + gitlab, Jira, confluence
Описание проекта: интернет-магазин цифровой/бытовой техники и электроники
Задачи: Нужно будет не только лидить команду, но и решать некоторые архитектурные вопросы. Также предстоит решать разные задачи, связанные с хранением и управлением контента для интернет-магазина, с интеграциями со сторонними системами.
Условия:
— Возможность сосредоточиться над задачами одного продукта;
— Сформированная команда крутых специалистов;
— Удалённая работа, оформление по ГПХ (договор гражданско-правового характера), ИП или как самозанятый.
— ЗП от 250 000 рублей
Контакты: [email protected] @jgribova
https://www.agima.ru/
Мы создаем веб-сервисы и мобильные приложения для бизнеса на основе данных и здравого смысла.
Уровень: senior
Основные требования:
— Опыт: java разработчик от 5 лет и 1 год опыт тимлида
— Java, Spring boot, mongo
— Опыт работы с Magnolia CMS (будет большим плюсом)
— Приветствуется опыт работы с другими CMS
— Git + gitlab, Jira, confluence
Описание проекта: интернет-магазин цифровой/бытовой техники и электроники
Задачи: Нужно будет не только лидить команду, но и решать некоторые архитектурные вопросы. Также предстоит решать разные задачи, связанные с хранением и управлением контента для интернет-магазина, с интеграциями со сторонними системами.
Условия:
— Возможность сосредоточиться над задачами одного продукта;
— Сформированная команда крутых специалистов;
— Удалённая работа, оформление по ГПХ (договор гражданско-правового характера), ИП или как самозанятый.
— ЗП от 250 000 рублей
Контакты: [email protected] @jgribova
AGIMA
AGIMA — Крупнейший интегратор digital‑решений
AGIMA — ваш надежный партнер в цифровой трансформации. Мы предлагаем комплексные решения для бизнеса, которые помогают достигать новых высот. Присоединяйтесь к числу успешных компаний, которые доверяют нам свои проекты!
☕️ ☁️ 👍 Начало работы с IntelliJ IDEA и распределенным SQL
Всерьез задумались о переносе инфраструктуры в облако? Тогда этот материал придется вам кстати. Попробуем разбираться, что это такое и с чем его едят.
https://proglib.io/sh/NZOYcsKetL
Всерьез задумались о переносе инфраструктуры в облако? Тогда этот материал придется вам кстати. Попробуем разбираться, что это такое и с чем его едят.
https://proglib.io/sh/NZOYcsKetL
Surviving the Whiteboard Interview (2019)
Автор: William Gant
Количество страниц: 136
Whiteboard-этап интервью может показаться большой проблемой для начинающих разработчиков. Опытные разработчики могут взять себя в руки и справиться с возрастающим напряжением, но как быть тем, кто собеседуется на позицию Junior'а? Автор книги использует свои реальные знания и опыт, чтобы помочь вам преодолеть психологические препятствия, связанные с интервью, а также предлагает образцы задач. При наличии достаточной подготовки и уверенности в себе вы сможете пройти whiteboard-собеседование в любой организации. Автор также дает общие советы по прохождению собеседования, например, рассказывает, как произвести наилучшее впечатление на интервьюера.
Скачать книгу
Автор: William Gant
Количество страниц: 136
Whiteboard-этап интервью может показаться большой проблемой для начинающих разработчиков. Опытные разработчики могут взять себя в руки и справиться с возрастающим напряжением, но как быть тем, кто собеседуется на позицию Junior'а? Автор книги использует свои реальные знания и опыт, чтобы помочь вам преодолеть психологические препятствия, связанные с интервью, а также предлагает образцы задач. При наличии достаточной подготовки и уверенности в себе вы сможете пройти whiteboard-собеседование в любой организации. Автор также дает общие советы по прохождению собеседования, например, рассказывает, как произвести наилучшее впечатление на интервьюера.
Скачать книгу
Telegram
Книги для программистов (reserved)
Surviving the Whiteboard Interview (2019)
Автор: William Gant
Автор: William Gant