Java Гениев
87 subscribers
204 photos
77 videos
180 links
Download Telegram
Как работает механизм CyclicBarrier и когда его следует использовать?

CyclicBarrier — это синхронизирующий механизм из библиотеки
java.util.concurrent в Java, который позволяет нескольким потокам остановиться в определенной точке выполнения до тех пор, пока все потоки не достигнут этой точки. После того, как все потоки достигают барьера, они могут продолжить выполнение. Этот механизм часто используется, когда нужно координировать действия группы потоков, чтобы они начинали выполнение следующего этапа одновременно.

Основные характеристики и работа:
1. Количество потоков: CyclicBarrier создается с числом потоков (или "участников"), которые должны достичь барьера. Пока не все участники достигнут барьера, они будут ожидать.

2. Метод `await()`: Каждый поток вызывает метод await() на объекте CyclicBarrier. Это указывает, что данный поток достиг барьера и должен ждать остальных. Как только все потоки вызовут этот метод, барьер "открывается", и все потоки продолжают выполнение.

3. Повторное использование (цикличность): После того, как все потоки проходят через барьер, он может быть использован повторно, поэтому и называется "циклическим". Это удобно для сценариев, где есть многократные синхронизации потоков на разных этапах выполнения программы.

4. Фаза действия: 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() {

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;
}


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. Координация этапов: Если нужно, чтобы несколько потоков выполнили этап работы и затем продолжили к следующему этапу только после того, как все потоки завершат текущий.

2. Параллельные вычисления: В задачах, где нужно разделить большую работу на части, которые обрабатываются параллельно, а затем необходимо синхронизировать результаты перед следующей фазой.

3. Многократные барьеры: Если требуется многократная синхронизация в течение выполнения задачи (например, при итерациях параллельного алгоритма).

Отличие от CountDownLatch:
- CyclicBarrier можно использовать многократно, в то время как CountDownLatch работает один раз.
- CyclicBarrier ожидает определенного числа потоков, тогда как CountDownLatch уменьшается каждый раз при вызове countDown(), независимо от того, каким потоком это было вызвано.

👉
Запуск однофайловых программ с исходным кодом

В JDK 11 Java представила возможность запускать программу из одного файла исходного кода с помощью команды java, без необходимости сначала явно компилировать исходный код. Это работает за счёт того, что команда java автоматически вызывает компилятор и сохраняет скомпилированный код в памяти. Это может быть отличным способом изучать Java или исследовать новые возможности в API Java, не проходя через процесс компиляции и последующего выполнения кода. Существует несколько способов использования этой функции, а также некоторые ограничения, которые нужно иметь в виду.

https://dev.java/learn/single-file-program/

👉
This media is not supported in your browser
VIEW IN TELEGRAM
🧠 Если у вас есть конфликты при мерже, не волнуйтесь!

Воспользуйтесь волшебной палочкой, чтобы разрешить простые конфликты. Убрав их, вы сможете сосредоточиться на разрешении остальных. #IntelliJIDEATips

👉
This media is not supported in your browser
VIEW IN TELEGRAM
Бесплатное IT-образование в 2024

Отобрали для вас полезные телеграм-каналы, которые помогут освоить программирование и другие IT-направления

Выбирайте нужное и подписывайтесь:

👩‍💻 Java:
👩‍💻 Моб. разработка:
👩‍💻 Frontend:
⚙️ Backend:
📱 GitHub:
🤓 Книги айти:
👩‍💻 Python:
👩‍💻 C#:
👩‍💻 С/С++:
🖥 Базы Данных & SQL:
👩‍💻 Golang:
👩‍💻 PHP:
👩‍💻 Разработка игр:
👩‍💻 DevOps:
🖥 Data Science:
🤔 Хакинг & ИБ:
🐞 Тестирование:
📱 Маркетинг:
🖥 Дизайн:

➡️ Сохраняйте себе, чтобы не потерять
Шпаргалка по паттернам проектирования

👉
Полнотекстовый поиск в java приложениях с помощью Elasticsearch

Рассмотрим, как использовать Elasticsearch в качестве поискового движка в приложениях на Spring Boot. Поговорим о стратегии реализации полнотекстового поиска, эффективной индексации сущностей JPA и их связей. Уделим внимание использованию аннотаций полей, настройке релевантности с помощью весовых коэффициентов и реализации нечёткого поиска для обработки вариаций запросов. Также обсудим методы
настройки синонимических связей, многоуровневых фильтров и ранжирования результатов по релевантности для повышения качества поиска.

https://habr.com/ru/companies/rostelecom/articles/851658/

👉
🚀 Советы по Java 🚀

Компактный конструктор в записях (Records)

Компактная форма помогает разработчикам сосредоточиться на проверке и нормализации параметров, без утомительной работы по присваиванию параметров полям. 🔥

👉
Проверка на null с помощью Optional

Optional помогает избежать NullPointerExceptions.


String name = "Alice";
Optional<String> maybeName = Optional.ofNullable(name);
System.out.println(maybeName.orElse("Nobody")); // Output: Alice


👉
Подчеркивания в числовых литералах (Java SE 7+):

Улучшите читаемость с помощью подчеркиваний в числах.


long largeNumber = 123_456_789L;
System.out.println(largeNumber); // Output: 123456789


👉
Двойная инициализация с помощью фигурных скобок (Java SE 7+):

Кратко инициализируйте коллекции.


Map<String, Integer> fruits = Map.of("apple", 1, "banana", 2);
System.out.println(fruits); // Output: {apple=1, banana=2}


👉
Помеченные операторы (break и continue):

Улучшите читаемость управления потоком с помощью меток.


loop:
for (int i = 0; i < 10; i++) {
if (i == 5) {
break loop; // Exit the loop labeled 'loop'
}
System.out.println(i);
}


👉
Spring Boot с SAML2 и Keycloak

Эта статья научит вас, как использовать аутентификацию SAML2 с Spring Boot и Keycloak. Security Assertion Markup Language (SAML) — это стандарт для обмена данными об аутентификации и авторизации между поставщиком удостоверений (IdP) и поставщиком услуг. Это протокол на основе XML, который использует токены безопасности с информацией о субъекте. В настоящее время SAML менее популярен, чем OICD (OpenID Connect), но еще не устарел. На самом деле, многие организации до сих пор используют SAML для единого входа (SSO).

https://piotrminkowski.com/2024/10/28/spring-boot-with-saml2-and-keycloak/

👉
Deprecated Event

В статье рассматривается новое событие в JDK 22 для JFR, позволяющее отслеживать вызовы устаревших методов. Это полезно для определения зависимостей в сторонних библиотеках, которые используют методы, планируемые к удалению, такие как методы Security Manager. Такое отслеживание позволяет заранее обновить библиотеки, что может сократить технический долг и упростить переход на актуальные версии библиотек и инструментов.


public class API {
public static void enableLogging(boolean enable) {
AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Void run() {
System.setProperty("log", String.valueOf(enable));
return null;
}
});
}
public static void runTask(Runnable task) {
try {
task.run();
} catch (ThreadDeath td) {
System.out.println("Task stopped.");
}
}
}

public class Service {
public static void log(String message) {
String shouldLog = System.getProperty("log", "true");
if (new Boolean("log")) {
System.out.print(message);
}
}
}


https://egahlin.github.io/2024/05/31/deprecated-event.html

👉
🚀AutoCloseable HTTP Client в Java 21

👉
Совет💡

До Hibernate 6 для правильной настройки требовалось установить правильный dialect для используемой БД. Начиная с версии 6 это больше не требуется. Теперь Hibernate 6 определяет правильный Dialect на основе JDBC URL и JDBC Metadata.

https://docs.jboss.org/hibernate/orm/6.3/javadocs/org/hibernate/cfg/JdbcSettings.html#DIALECT

👉
Три быстрых способа отображения Java-объектов в пользовательском интерфейсе

В процессе разработки часто наступает момент, когда необходимо быстро отобразить на экране структуры данных в удобочитаемом формате. Во время разработки отладчики часто предоставляют красивое древовидное представление объектов данных, которое помогает визуализировать структуру. Создать нечто подобное для пользовательского интерфейса вручную, конечно, можно, но во многих случаях это слишком дорого - особенно в случае быстрой разработки приложений (RAD) или внутренних бизнес-приложений.
Сегодня генеративный ИИ может создавать достойные визуализации, но на ранних этапах разработки более идеальным было бы полностью динамическое решение.

https://vaadin.com/blog/three-quick-ways-to-display-your-java-objects-in-the-ui


👉
Media is too big
VIEW IN TELEGRAM
Spring – эволюция или революция!? | Spring АйО Подкаст №1

В первом выпуске подкаста Spring АйО в студии собрались 4 эксперта сообщества, чтобы попытаться раз и навсегда ответить на вопрос, чем же для нас стал Spring – эволюцией или революцией?

––––– Таймкоды –––––
00:00:00 – Всем привет!
00:00:28 – Какими были ваши первые ощущения от Spring?
00:01:14 – В чём секрет популярности Spring?
00:02:56 – Существует ли Spring без Boot?
00:05:30 – Победил ли Spring?
00:07:08 – А что с другими DI-фреймворками?
00:10:15 – Spring Native – таблетка от всех проблем?
00:14:30 – Что должно быть bean, а что нет?
00:22:10 – Как правильно внедрять зависимость?
00:26:20 – Что там со Spring Data, Михаил?
00:34:19 – AI заменит StackOverflow и Baeldung?
00:36:20 – Не становится ли Spring слишком сложным?
00:39:50 – Почему документация Spring так плоха?
00:41:23 – Есть ли рудименты в Spring?
00:43:28 – Зашел ли в тупик реактивный стек?
00:52:20 – Тупеют ли разработчики из-за Spring?
01:00:42 – В чём разница между сеньором сейчас...
В чем отличие между поверхностным и глубоким клонированием?

Поверхностное копирование копирует настолько малую часть информации об объекте, насколько это возможно. По умолчанию, клонирование в Java является поверхностным, т.е. класс Object не знает о структуре класса, которого он копирует. Клонирование такого типа осуществляется JVM по следующим правилам:

✔️ Если класс имеет только члены примитивных типов, то будет создана совершенно новая копия объекта и возвращена ссылка на этот объект.
✔️ Если класс помимо членов примитивных типов содержит члены ссылочных типов, то тогда копируются ссылки на объекты этих классов. Следовательно, оба объекта будут иметь одинаковые ссылки.

Глубокое копирование дублирует абсолютно всю информацию объекта:

✔️ Нет необходимости копировать отдельно примитивные данные;
✔️ Все члены ссылочного типа в оригинальном классе должны поддерживать клонирование. Для каждого такого члена при переопределении метода clone() должен вызываться super.clone();
✔️ Если какой-либо член класса не поддерживает клонирование, то в методе клонирования необходимо создать новый экземпляр этого класса и скопировать каждый его член со всеми атрибутами в новый объект класса, по одному.

👉
Хотите упростить JPA-запросы в Spring Data?

Ознакомьтесь с демонстрацией Query By Example (QBE)! Создавайте динамические, безопасные для типов запросы без шаблонов.

Идеально подходит для гибких форм поиска

Java 23 + Spring Boot + Spring Data JPA

https://github.com/danvega/qbe

👉