Рассказываю про крипту и инвестиции на понятном языке.
Сотрудничество — @TGowner999
Больше информации о нашей сети: https://t.me/TGownerTOP
Last updated 1 month ago
Утро начинается не с кофе.
Сотрудничество: @evoanna (по всем вопросам, только мне писать)
Канал в реестре: https://clck.ru/3FCQfU
Last updated 1 day, 22 hours ago
Самые любимые рецепты для Вас!
Контакт: @khaitbayev
Доверенные менеджеры тут:
https://t.me/+reWsclRikXIxOTcy
Ссылка для приглашения: https://t.me/+wsrt9bX3G1U3Zjg6
Last updated 1 week, 2 days ago
Подчеркивания в числовых литералах (Java SE 7+):
Улучшите читаемость с помощью подчеркиваний в числах.
```
long largeNumber = 123_456_789L;
System.out.println(largeNumber); // Output: 123456789
```
Виртуальные потоки: революционное решение для параллелизма
Несмотря на то, что платформе Java почти 30 лет, она стабильно остаётся одной из трёх самых популярных языков программирования. Эта продолжающаяся популярность обусловлена виртуальной машиной Java (JVM), которая абстрагирует такие сложности, как управление памятью, и компилирует код во время выполнения, обеспечивая непревзойдённую масштабируемость на уровне интернета.
Долговременная актуальность Java также объясняется быстрым развитием языка, его библиотек и JVM. Виртуальные потоки Java, представленные в проекте Loom, инициативе сообщества OpenJDK, знаменуют собой революционное изменение в том, как Java справляется с параллелизмом.
Запускает 10 000 platform threads
```
public class PlatformThreadCreationTimeAnalyzer {
private static class Task implements Runnable {
@Override
public void run() {
System.out.println("Hello! I am a Platform Thread");
}
}
public static void main(String[] args) throws Exception {
long startTime = System.currentTimeMillis();
for (int counter = 0; counter < 10\_000; ++counter) {
new Thread(new Task()).start();
}
System.out.print("Platform Thread Creation Time: " + (System.currentTimeMillis() \- startTime));
}
}
```
https://dzone.com/articles/deep-dive-into-java-virtual-threads-a-game-changer
Yandex Cloud запустил сервис для ускорения разработки продуктов в облаке Yandex Serverless Integrations
Теперь разработчики смогут при минимальном написании кода автоматизировать различные процессы, например обработку онлайн-заказов и мониторинг систем безопасности.
Сделать это можно благодаря инструменту Yandex Workflows — он позволяет описать последовательность операций с помощью декларативного языка YAML. Сервис автоматически запустит эти процессы и проконтролирует их выполнение.
Помимо этого, Yandex Serverless Integrations включает в себя инструменты EventRouter для передачи событий между сервисами и API Gateway для создания шлюзов между внешними и облачными сервисами по спецификации OpenAPI 3.0.
Читайте подробнее в статье
👩💻 Хотите стать экспертом в разработке на Spring Framework?
Обучение на курсе «Разработчик на Spring Framework» от OTUS — это практический подход к освоению самого востребованного фреймворка для Java-разработчиков.
Узнайте, как создавать веб-приложения на микросервисной архитектуре, автоматизировать задачи с Spring Boot и реализовывать высокоуровневые решения!
В конце курса у вас будет портфолио из готовых приложений и глубокое понимание работы со Spring. Пройдите вебинар-собеседование, чтобы быть готовым к реальным интервью.
➡️ Пройдите вступительный тест для записи на курс и перейдите на новый профессиональный уровень с дипломом, признанным крупными компаниями: https://vk.cc/cCMlGq
Реклама. ООО «Отус онлайн\-образование», ОГРН 1177746618576, www.otus.ru
Как работает механизм CyclicBarrier и когда его следует использовать? CyclicBarrier — это синхронизирующий механизм из библиотеки
java.util.concurrent
в Java, который позволяет нескольким потокам остановиться в определенной точке выполнения до тех пор, пока все потоки не достигнут этой точки. После того, как все потоки достигают барьера, они могут продолжить выполнение. Этот механизм часто используется, когда нужно координировать действия группы потоков, чтобы они начинали выполнение следующего этапа одновременно.
Основные характеристики и работа:
1. Количество потоков: CyclicBarrier
создается с числом потоков (или "участников"), которые должны достичь барьера. Пока не все участники достигнут барьера, они будут ожидать.
Метод await()
: Каждый поток вызывает метод await()
на объекте CyclicBarrier
. Это указывает, что данный поток достиг барьера и должен ждать остальных. Как только все потоки вызовут этот метод, барьер "открывается", и все потоки продолжают выполнение.
Повторное использование (цикличность): После того, как все потоки проходят через барьер, он может быть использован повторно, поэтому и называется "циклическим". Это удобно для сценариев, где есть многократные синхронизации потоков на разных этапах выполнения программы.
Фаза действия: CyclicBarrier
может быть настроен так, чтобы выполнять определенное действие (заданный Runnable
) один раз, когда все потоки достигают барьера. Это полезно для выполнения дополнительной работы после завершения синхронизации.
Пример использования:
```
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierExample {
public static void main(String[] args) {
int numThreads = 3;
CyclicBarrier barrier = new CyclicBarrier(numThreads, new Runnable() {
@Override
public void run() {
System.out.println("Все потоки достигли барьера. Выполняем действие.");
}
});
for (int i = 0; i < numThreads; i++) {
new Thread(new Task(barrier)).start();
}
}
}
class Task implements Runnable {
private CyclicBarrier barrier;
public Task(CyclicBarrier barrier) {
this.barrier = barrier;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " выполняет работу.");
Thread.sleep(1000); // Симуляция работы
System.out.println(Thread.currentThread().getName() + " достиг барьера.");
barrier.await(); // Ожидание остальных потоков
System.out.println(Thread.currentThread().getName() + " продолжает выполнение.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
Когда использовать CyclicBarrier
:
1. Координация этапов: Если нужно, чтобы несколько потоков выполнили этап работы и затем продолжили к следующему этапу только после того, как все потоки завершат текущий.
Параллельные вычисления: В задачах, где нужно разделить большую работу на части, которые обрабатываются параллельно, а затем необходимо синхронизировать результаты перед следующей фазой.
Многократные барьеры: Если требуется многократная синхронизация в течение выполнения задачи (например, при итерациях параллельного алгоритма).
Отличие от CountDownLatch
:
- CyclicBarrier
можно использовать многократно, в то время как CountDownLatch
работает один раз.
- CyclicBarrier
ожидает определенного числа потоков, тогда как CountDownLatch
уменьшается каждый раз при вызове countDown()
, независимо от того, каким потоком это было вызвано.
Расскажите про приведение типов. Что такое понижение и повышение типа?
Java является строго типизированным языком программирования, а это означает, то что каждое выражение и каждая переменная имеет строго определенный тип уже на момент компиляции. Однако определен механизм приведения типов (casting) - способ преобразования значения переменной одного типа в значение другого типа.
В Java существуют несколько разновидностей приведения:
• Тождественное (identity). Преобразование выражения любого типа к точно такому же типу всегда допустимо и происходит автоматически.
• Расширение (повышение, upcasting) примитивного типа (widening primitive). Означает, что осуществляется переход от менее емкого типа к более ёмкому. Например, от типа byte (длина 1 байт) к типу int (длина 4 байта). Такие преобразование безопасны в том смысле, что новый тип всегда гарантировано вмещает в себя все данные, которые хранились в старом типе и таким образом не происходит потери данных. Этот тип приведения всегда допустим и происходит автоматически.
• Сужение (понижение, downcasting) примитивного типа (narrowing primitive). Означает, что переход осуществляется от более емкого типа к менее емкому. При таком преобразовании есть риск потерять данные. Например, если число типа int было больше 127, то при приведении его к byte значения битов старше восьмого будут потеряны. В Java такое преобразование должно совершаться явным образом, при этом все старшие биты, не умещающиеся в новом типе, просто отбрасываются - никакого округления или других действий для получения более корректного результата не производится.
• Расширение объектного типа (widening reference). Означает неявное восходящее приведение типов или переход от более конкретного типа к менее конкретному, т.е. переход от потомка к предку. Разрешено всегда и происходит автоматически.
• Сужение объектного типа (narrowing reference). Означает нисходящее приведение, то есть приведение от предка к потомку (подтипу). Возможно только если исходная переменная является подтипом приводимого типа. При несоответствии типов в момент выполнения выбрасывается исключение ClassCastException. Требует явного указания типа.
• Преобразование к строке (to String). Любой тип может быть приведен к строке, т.е. к экземпляру класса String.
• Запрещенные преобразования (forbidden). Не все приведения между произвольными типами допустимы. Например, к запрещенным преобразованиям относятся приведения от любого ссылочного типа к примитивному и наоборот (кроме преобразования к строке). Кроме того, невозможно привести друг к другу классы, находящиеся на разных ветвях дерева наследования и т.п.
При приведении ссылочных типов с самим объектом ничего не происходит - меняется лишь тип ссылки, через которую происходит обращение к объекту.
Для проверки возможности приведения нужно воспользоваться оператором `instanceof:
Parent parent = new Child();
if (parent instanceof Child) {
Child child = (Child) parent;
}`
Совет по Java💡****
При использовании Projections и QueryDSL, вместо того чтобы использовать Projections.constructor
(Class type, Expression ...), можно добиться большей типобезопасности, применяя аннотации @QueryProjection
и @QueryEntity
. Таким образом, для вашей проекции будет сгенерирован типобезопасный QClass
.
*👩💻 «Знакомство со Spring Cloud».*
Приглашаем на открытый урок, где мы разберем:
✔️ что такое Spring Cloud и для чего он нужен;
✔️ из каких основных компонентов состоит Spring Cloud;
✔️ как использовать ключевые функции Spring Cloud для разработки.
🗓 10 октября в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Professional»
🔗 Ссылка на регистрацию : https://vk.cc/cCcj9h
Реклама. ООО «Отус онлайн\-образование», ОГРН 1177746618576
Рассказываю про крипту и инвестиции на понятном языке.
Сотрудничество — @TGowner999
Больше информации о нашей сети: https://t.me/TGownerTOP
Last updated 1 month ago
Утро начинается не с кофе.
Сотрудничество: @evoanna (по всем вопросам, только мне писать)
Канал в реестре: https://clck.ru/3FCQfU
Last updated 1 day, 22 hours ago
Самые любимые рецепты для Вас!
Контакт: @khaitbayev
Доверенные менеджеры тут:
https://t.me/+reWsclRikXIxOTcy
Ссылка для приглашения: https://t.me/+wsrt9bX3G1U3Zjg6
Last updated 1 week, 2 days ago