Ответ:
@javatasks #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥5❤4
@javatasks #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍29🔥5👏2
Какие брокеры использовать, чтобы обеспечить асинхронную связь между микросервисами?
Узнайте на открытом практическом уроке «Брокеры сообщений: RabbitMQ и Kafka» от OTUS, где мы узнаем:
✅ что такое брокеры сообщений и как они помогают в архитектуре микросервисов
✅ основные различия между RabbitMQ и Kafka, включая их архитектурные подходы
✅ как развернуть и настроить RabbitMQ и Kafka для ваших приложений
✅ практическое использование обоих брокеров на реальных примерах в live demo
🗓 Встречаемся 24 октября в 20:00 мск в преддверии старта курса «Microservice Architecture». Все участники вебинара получат специальную цену на обучение и консультацию от менеджеров OTUS!
➡️ Ссылка для регистрации: https://vk.cc/cD4UHz
Узнайте на открытом практическом уроке «Брокеры сообщений: RabbitMQ и Kafka» от OTUS, где мы узнаем:
✅ что такое брокеры сообщений и как они помогают в архитектуре микросервисов
✅ основные различия между RabbitMQ и Kafka, включая их архитектурные подходы
✅ как развернуть и настроить RabbitMQ и Kafka для ваших приложений
✅ практическое использование обоих брокеров на реальных примерах в live demo
🗓 Встречаемся 24 октября в 20:00 мск в преддверии старта курса «Microservice Architecture». Все участники вебинара получат специальную цену на обучение и консультацию от менеджеров OTUS!
➡️ Ссылка для регистрации: https://vk.cc/cD4UHz
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍7🥰3🔥2
Параллелизм и многопоточность — это два разных, но связанных понятия в программировании. Многопоточность означает
Параллелизм, с другой стороны, означает
@javatasks #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥6
- умение использовать современные фреймворки: Spring WebFlux, Kafka, реактивный Postgres, Kubernetes.
Вы получите инструменты и знания, которые помогут вам писать код быстрее и чище. Все практические навыки вы сможете незамедлительно применять в своей работе.
Готовы прокачать свою востребованность?
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2🔥2🥴1
Как работают параллельные стримы?
Основная цель, ради которой в Java 8 был добавлен Stream API – удобство многопоточной обработки.
Обычный стрим будет выполняться параллельно после вызова промежуточной операции parallel(). Некоторые стримы создаются уже многопоточными, например результат вызова Collection#parallelStream(). Для распараллеливания используется единый общий ForkJoinPool.
Внутри реализации потока его сплиттератор оборачивается в AbstractTask, который и отправляется на выполнение в пул. AbstractTask при выполнении считывает estimateSize сплиттератора и текущую степень параллелизма пула. На основе этих данных он принимает решение, распараллелить ли сплиттератор на два методом trySplit().
У удобства такого решения есть обратная сторона. Так как пул единый, нагрузка распределяется на всех пользователей параллельных стримов в программе. Если в одном потоке выполняются долгие блокирующие операции, это может ударить по производительности в совершенно не связанном с ним другом потоке.
Если всё же требуется использовать отдельный пул потоков, сам стрим выполняется как задача этого отдельного пула.
Основная цель, ради которой в Java 8 был добавлен Stream API – удобство многопоточной обработки.
Обычный стрим будет выполняться параллельно после вызова промежуточной операции parallel(). Некоторые стримы создаются уже многопоточными, например результат вызова Collection#parallelStream(). Для распараллеливания используется единый общий ForkJoinPool.
Внутри реализации потока его сплиттератор оборачивается в AbstractTask, который и отправляется на выполнение в пул. AbstractTask при выполнении считывает estimateSize сплиттератора и текущую степень параллелизма пула. На основе этих данных он принимает решение, распараллелить ли сплиттератор на два методом trySplit().
У удобства такого решения есть обратная сторона. Так как пул единый, нагрузка распределяется на всех пользователей параллельных стримов в программе. Если в одном потоке выполняются долгие блокирующие операции, это может ударить по производительности в совершенно не связанном с ним другом потоке.
Если всё же требуется использовать отдельный пул потоков, сам стрим выполняется как задача этого отдельного пула.
👍8🔥3
Интенсив по очередям: Kafka & NATS
Асинхронное взаимодействие и очереди — невероятно широкая тема, и обязательная к изучению всем, кто интересуется архитектурой. Разработчику важно понимать архитектурные особенности, сильные и слабые стороны компонент, на базе которых строится архитектура.
Приходите на курс “Интенсив по очередям: Kafka & NATS”
🌐 В программе:
▪️Асинхронное взаимодействие с помощью очередей: подходы, свойства, гарантии
▪️Какие бывают очереди, основные системы очередей, на какие свойства и требования смотреть при выборе
▪️Как конфигурировать и управлять системами очередей
▪️Архитектура Apache Kafka, streams, topics, конфигурации от минимального single instance до production grade кластера с отказоустойчивостью
▪️Архитектуры NATS, pub/sub, req/res, streaming, кластер, суперкластер, федерация, edge.
Обучение в формате «живых» онлайн-сессий (лекции, брейнштормы, демо).
🥸 Кто мы: R&D-центр Devhands.io, наш канал (https://t.iss.one/rybakalexey). Автор курса — Владимир Перепелица, эксперт по большим проектам, очередям и Tarantool, Solution Architect в Exness, создатель S3 в VK Cloud, регулярный спикер и член ПК конференций Highload.
🗓 Старт курса 13 ноября, 5 недель обучения. Изучить программу и записаться можно здесь
Ждём вас!
Реклама. ИП Рыбак А.А. ИНН 771407709607 Erid: 2VtzqxiGJPM
Асинхронное взаимодействие и очереди — невероятно широкая тема, и обязательная к изучению всем, кто интересуется архитектурой. Разработчику важно понимать архитектурные особенности, сильные и слабые стороны компонент, на базе которых строится архитектура.
Приходите на курс “Интенсив по очередям: Kafka & NATS”
▪️Асинхронное взаимодействие с помощью очередей: подходы, свойства, гарантии
▪️Какие бывают очереди, основные системы очередей, на какие свойства и требования смотреть при выборе
▪️Как конфигурировать и управлять системами очередей
▪️Архитектура Apache Kafka, streams, topics, конфигурации от минимального single instance до production grade кластера с отказоустойчивостью
▪️Архитектуры NATS, pub/sub, req/res, streaming, кластер, суперкластер, федерация, edge.
Обучение в формате «живых» онлайн-сессий (лекции, брейнштормы, демо).
Ждём вас!
Реклама. ИП Рыбак А.А. ИНН 771407709607 Erid: 2VtzqxiGJPM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3🔥3
Эти три термина часто путают, но они имеют принципиально разные значения:
🔹 final — это ключевое слово, используемое для
▪️ Переменная: значение не может быть изменено после инициализации.
▪️ Метод: не может быть переопределён в подклассе.
▪️ Класс: запрещает наследование.
🔹 finally — это блок кода, который
🔹 finalize() — это метод, который
@javatasks #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤2🔥2
Поговорим про деньги в IT?
Приглашаем опытных IT-специалистов пройти небольшой опрос про зарплаты и бенефиты в технологических компаниях. Это займёт не более 7 минут — а ваше мнение поможет одному крупному российскому работодателю делать актуальные оферы.
Пройти опрос можно здесь
Приглашаем опытных IT-специалистов пройти небольшой опрос про зарплаты и бенефиты в технологических компаниях. Это займёт не более 7 минут — а ваше мнение поможет одному крупному российскому работодателю делать актуальные оферы.
Пройти опрос можно здесь
👍6🥰4🔥3
Чем CompletableFuture отличается от Future?
Future – интерфейс, который представляет пока еще недовычисленный результат. Когда породившая его асинхронная операция заканчивается, он заполняется значением. Метод get блокирует выполнение до получения результата, isDone проверяет его наличие. К примеру результат выполнения задач в ExecutorService, ForkJoinTask, реализует интерфейс Future.
CompletableFuture появился в Java 8. Это класс-реализация старого интерфейса Future, а значит всё сказанное выше справедливо и для него. Вдобавок к этому, CompletableFuture реализует работу с отложенными результатами посредством коллбэков. Метод thenApply регистрирует код обработки значения, который будет автоматически вызван позже, когда это значение появится.
В Java 9 прогресс пошел дальше, и появилась библиотека Flow API. Это встроенная реализация реактивных стримов. Реактивный стрим, сильно упрощая, – это более общий случай, последовательность отложенных значений. Другая их реализация – популярная, но не входящая в стандарт библиотека Reactive Extensions (RxJava).
Future – интерфейс, который представляет пока еще недовычисленный результат. Когда породившая его асинхронная операция заканчивается, он заполняется значением. Метод get блокирует выполнение до получения результата, isDone проверяет его наличие. К примеру результат выполнения задач в ExecutorService, ForkJoinTask, реализует интерфейс Future.
CompletableFuture появился в Java 8. Это класс-реализация старого интерфейса Future, а значит всё сказанное выше справедливо и для него. Вдобавок к этому, CompletableFuture реализует работу с отложенными результатами посредством коллбэков. Метод thenApply регистрирует код обработки значения, который будет автоматически вызван позже, когда это значение появится.
В Java 9 прогресс пошел дальше, и появилась библиотека Flow API. Это встроенная реализация реактивных стримов. Реактивный стрим, сильно упрощая, – это более общий случай, последовательность отложенных значений. Другая их реализация – популярная, но не входящая в стандарт библиотека Reactive Extensions (RxJava).
👍17🔥6❤3🎉2
🔒 Частное облако SpaceWeb — полный контроль и безопасность для вашего бизнеса
Создавайте изолированные среды для корпоративных приложений и данных. Наше частное облако сочетает максимальную безопасность, гибкость и легкость управления. Идеально подходит для тех, кто ценит конфиденциальность и защиту.
💼 Ваши данные — под надежной защитой, доступ к ним — в любое время, в любой точке мира.
Хотите узнать больше? Подпишитесь на канал SpaceWeb и будьте в курсе всех новинок в мире облачных технологий!
Реклама.ООО "СпейсВэб". ИНН: 7813376370 erid: 2Vtzqv2c7nC
Создавайте изолированные среды для корпоративных приложений и данных. Наше частное облако сочетает максимальную безопасность, гибкость и легкость управления. Идеально подходит для тех, кто ценит конфиденциальность и защиту.
💼 Ваши данные — под надежной защитой, доступ к ним — в любое время, в любой точке мира.
Хотите узнать больше? Подпишитесь на канал SpaceWeb и будьте в курсе всех новинок в мире облачных технологий!
Реклама.ООО "СпейсВэб". ИНН: 7813376370 erid: 2Vtzqv2c7nC
👍4❤2🔥2
👍8❤3🔥2
Зачем выбирать ReentrantLock вместо synchronized?
Объект класса ReentrantLock решает те же задачи, что и блок synchronized. Поток висит на вызове метода lock() в ожидании своей очереди занять этот объект. Владеть локом, как и находиться внутри блока synchronized может только один поток одновременно. unlock(), подобно выходу из блока синхронизации, освобождает объект-монитор для других потоков.
В отличие от блока синхронизации, ReentrantLock дает расширенный интерфейс для получения информации о состоянии блокировки. Методы лока позволяют еще до блокировки узнать, занят ли он сейчас, сколько потоков ждут его в очереди, сколько раз подряд текущий поток завладел им.
Шире и возможные режимы блокировки. Кроме обычного ожидающего lock(), вариант tryLock() с параметром ожидает своей очереди только заданное время, а без параметра – вообще не ждет, а только захватывает свободный лок.
Еще одно отличие – свойство fair. Лок с этим свойством обеспечивает «справедливость» очереди: пришедший раньше поток захватывает объект раньше. Блок synchronized не дает никаких гарантий порядка.
Объект класса ReentrantLock решает те же задачи, что и блок synchronized. Поток висит на вызове метода lock() в ожидании своей очереди занять этот объект. Владеть локом, как и находиться внутри блока synchronized может только один поток одновременно. unlock(), подобно выходу из блока синхронизации, освобождает объект-монитор для других потоков.
В отличие от блока синхронизации, ReentrantLock дает расширенный интерфейс для получения информации о состоянии блокировки. Методы лока позволяют еще до блокировки узнать, занят ли он сейчас, сколько потоков ждут его в очереди, сколько раз подряд текущий поток завладел им.
Шире и возможные режимы блокировки. Кроме обычного ожидающего lock(), вариант tryLock() с параметром ожидает своей очереди только заданное время, а без параметра – вообще не ждет, а только захватывает свободный лок.
Еще одно отличие – свойство fair. Лок с этим свойством обеспечивает «справедливость» очереди: пришедший раньше поток захватывает объект раньше. Блок synchronized не дает никаких гарантий порядка.
👍23🎉10❤4
Тестовое собеседование на Middle Java-разработчика завтра
Заходи завтра, 30 октября в 19:00 по мск, на открытое онлайн-собеседование от ШОРТКАТ, чтобы узнать:
— Чего ждут от кандидатов на Middle позиции в Java-разработке
— Какие вопросы задают на интервью и зачем
— Как подготовиться к собесу, чтобы получить оффер
Интервью проведёт Илья Аров — ведущий разработчик программного обеспечения в T1, ВТБ ID
Чтобы записаться на эфир, переходи в бот → @shortcut_sh_bot
Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2VtzqwvFFaC
Заходи завтра, 30 октября в 19:00 по мск, на открытое онлайн-собеседование от ШОРТКАТ, чтобы узнать:
— Чего ждут от кандидатов на Middle позиции в Java-разработке
— Какие вопросы задают на интервью и зачем
— Как подготовиться к собесу, чтобы получить оффер
Интервью проведёт Илья Аров — ведущий разработчик программного обеспечения в T1, ВТБ ID
Чтобы записаться на эфир, переходи в бот → @shortcut_sh_bot
Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2VtzqwvFFaC
👍4🔥3
Как используется метод Lock.newCondition()?
Если реализации интерфейса Lock представляют высокоуровневую альтернативу блока synchronized, то реализации его спутника, интерфейса Condition – альтернатива методам notify/wait. Оба этих интерфейса относятся к пакету java.util.concurrent.locks.
Как и ожидание на мониторе, Condition реализует примитив синхронизации «Условная переменная». Один или несколько потоков зависают на объекте-кондишне с помощью варианта метода await (ждут удовлетворения условия). Другой поток пробуждает их методами signal и signalAll (сигнализирует об удовлетворении условия).
Конкретные реализации Condition всегда решают те же задачи, что блокировка на мониторе, но в теории могут отличаться в нюансах поведения. Например, может не быть требования вызывать ожидание/сигнал только при захваченном локе (аналог требования, по которому notify/wait всегда вызываются в synchronized). Или может гарантироваться порядок получения сигнала ожидающими потоками.
Возвращаясь к поставленному вопросу, Condition всегда связан со своим объектом типа Lock, и метод Lock.newCondition() – единственный правильный способ создания кондишна.
Если реализации интерфейса Lock представляют высокоуровневую альтернативу блока synchronized, то реализации его спутника, интерфейса Condition – альтернатива методам notify/wait. Оба этих интерфейса относятся к пакету java.util.concurrent.locks.
Как и ожидание на мониторе, Condition реализует примитив синхронизации «Условная переменная». Один или несколько потоков зависают на объекте-кондишне с помощью варианта метода await (ждут удовлетворения условия). Другой поток пробуждает их методами signal и signalAll (сигнализирует об удовлетворении условия).
Конкретные реализации Condition всегда решают те же задачи, что блокировка на мониторе, но в теории могут отличаться в нюансах поведения. Например, может не быть требования вызывать ожидание/сигнал только при захваченном локе (аналог требования, по которому notify/wait всегда вызываются в synchronized). Или может гарантироваться порядок получения сигнала ожидающими потоками.
Возвращаясь к поставленному вопросу, Condition всегда связан со своим объектом типа Lock, и метод Lock.newCondition() – единственный правильный способ создания кондишна.
👍11❤3🔥2
Короче, ищем менторов — Middle и Senior Java-разработчиков
Ищем в ШОРТКАТ — менторскую платформу от команды разработчиков из бигтеха. Мы помогаем найти крутую работу, апнуть грейд или сменить стек.
Что надо будет делать: проводить тестовые собесы → оценивать грейд → помогать разбираться в сложных темах.
Что взамен:
— От 40К за 5-7 часов работы в неделю
— Доступ к обучению и комьюнити сильных менторов из Booking, Сбер, Oracle, Tinkoff
— Возможность выступать на эфирах, куда уже приходят 500+ джавистов, и стать заметнее на рынке
Заполняй форму — свяжемся и расскажем подробности ➡️ https://forms.gle/rFY9z9GKggqfgSS76
Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2Vtzqvk2pAY
Ищем в ШОРТКАТ — менторскую платформу от команды разработчиков из бигтеха. Мы помогаем найти крутую работу, апнуть грейд или сменить стек.
Что надо будет делать: проводить тестовые собесы → оценивать грейд → помогать разбираться в сложных темах.
Что взамен:
— От 40К за 5-7 часов работы в неделю
— Доступ к обучению и комьюнити сильных менторов из Booking, Сбер, Oracle, Tinkoff
— Возможность выступать на эфирах, куда уже приходят 500+ джавистов, и стать заметнее на рынке
Заполняй форму — свяжемся и расскажем подробности ➡️ https://forms.gle/rFY9z9GKggqfgSS76
Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2Vtzqvk2pAY
😁7🔥4👍3❤1
Чем отличается ReentrantLock от обычного Lock?
Lock – это интерфейс, ReentrantLock – его реализация. «Reentrant» говорит о том, что один и тот же поток может перезахватывать уже захваченный лок. Интерфейс не требует этого свойства. Обычный блок synchronized тоже является reentrant – вложенная синхронизация на том же мониторе отработает без проблем.
Примеры не-reentrant локов из стандартной библиотеки – представления класса StampedLock, возвращаемые его методами asReadLock() и asWriteLock().
Lock – это интерфейс, ReentrantLock – его реализация. «Reentrant» говорит о том, что один и тот же поток может перезахватывать уже захваченный лок. Интерфейс не требует этого свойства. Обычный блок synchronized тоже является reentrant – вложенная синхронизация на том же мониторе отработает без проблем.
Примеры не-reentrant локов из стандартной библиотеки – представления класса StampedLock, возвращаемые его методами asReadLock() и asWriteLock().
👍9🎉3🔥2
Как использовать ReadWriteLock?
Стандартный интерфейс ReadWriteLock предоставляет потокобезопасный разделенный доступ на чтение и на запись. Для этих целей в нём объявлены два метода: readLock() и writeLock(). Они возвращают объекты под интерфейсом Lock.
Оба типа блокировок одного экземпляра ReadWriteLock связаны. Пока какой-то поток не заберет блокировку на запись, сколько угодно потоков могут читать не мешая друг другу. Блокировкой readLock закрывается часть кода с семантикой «только чтения» некоторого условного «ресурса». В критической секции кода writeLock осуществляется модификация ресурса.
Свойства этих локов защищают программу от ситуаций конкурентной записи ресурса и чтения во время записи. Подобно copy-on-write коллекциям, этот подход становится выгодным, когда ресурс читают сильно чаще чем модифицируют.
Интерфейс реализуется классом ReentrantReadWriteLock, который во многом похож на обычный ReentrantLock.
Стандартный интерфейс ReadWriteLock предоставляет потокобезопасный разделенный доступ на чтение и на запись. Для этих целей в нём объявлены два метода: readLock() и writeLock(). Они возвращают объекты под интерфейсом Lock.
Оба типа блокировок одного экземпляра ReadWriteLock связаны. Пока какой-то поток не заберет блокировку на запись, сколько угодно потоков могут читать не мешая друг другу. Блокировкой readLock закрывается часть кода с семантикой «только чтения» некоторого условного «ресурса». В критической секции кода writeLock осуществляется модификация ресурса.
Свойства этих локов защищают программу от ситуаций конкурентной записи ресурса и чтения во время записи. Подобно copy-on-write коллекциям, этот подход становится выгодным, когда ресурс читают сильно чаще чем модифицируют.
Интерфейс реализуется классом ReentrantReadWriteLock, который во многом похож на обычный ReentrantLock.
👍11🔥3😁2❤1😱1
❓Какой самый больной вопрос для IT-команд? Тестирование микросервисов!
Откройте все секреты! Как повысить отказоустойчивость и управлять взаимодействиями между сервисами?
👨💻🛠👨🏻💻 На открытом уроке мы разберем всё: от юнит-тестов до тестов производительности.
Присоединяйтесь к бесплатному вебинару 7 ноября в 20:00 мск и получите практические инструменты для работы с микросервисами. А еще скидку на обучение на курсе «Software Architect»!
🔴 Регистрируйтесь прямо сейчас и получите доступ к лучшим практикам тестирования в распределённых системах: https://vk.cc/cE6aet
Откройте все секреты! Как повысить отказоустойчивость и управлять взаимодействиями между сервисами?
👨💻🛠👨🏻💻 На открытом уроке мы разберем всё: от юнит-тестов до тестов производительности.
Присоединяйтесь к бесплатному вебинару 7 ноября в 20:00 мск и получите практические инструменты для работы с микросервисами. А еще скидку на обучение на курсе «Software Architect»!
🔴 Регистрируйтесь прямо сейчас и получите доступ к лучшим практикам тестирования в распределённых системах: https://vk.cc/cE6aet
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍4🥰3🔥2👏1