Easy Java
5.22K subscribers
311 photos
51 videos
462 links
Лучшие обучающие материалы и другие полезности для Java-разработчиков.

Сотрудничество: @heywan_n1

Цены: @heywan_media

Реклама на бирже: https://telega.in/c/+r8kkGSypBY84MmIy
Download Telegram
📖 Обмен событиями распределённого приложения на Java

Сегодня я хочу рассказать вам об одном из вариантов доставки событий для распределённого приложения на Java.

Это доставка событий через БД, в которой хранится состояние распределённого приложения.


Читать статью

➡️ Easy Java | #Статья
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁11🤔32🔥1
Вопрос с собеса

Что такое Daemon-потоки в Java и чем они отличаются от обычных?

Пример🔽
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread daemon = new Thread(() -> {
while (true) {
System.out.println("Демон работает...");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
break;
}
}
});

daemon.setDaemon(true); // делаем поток демоном
daemon.start();

Thread.sleep(1500);
System.out.println("Главный поток завершён");
}
}


Ответ🔽
Обычные (user) потоки удерживают JVM «живой», пока они выполняются.
Daemon-потоки — это «служебные» потоки, которые автоматически завершаются, когда все пользовательские потоки завершены.

📌 Применения:
— сборка мусора (GC в JVM — это демон)
— фоновые задачи (логирование, мониторинг)
— вспомогательные сервисы, не критичные для завершения программы

Важно: daemon-потоки могут быть остановлены в любой момент при завершении JVM, поэтому их нельзя использовать для критически важных операций (например, записи в БД).


➡️ Easy Java | #Собес
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Please open Telegram to view this post
VIEW IN TELEGRAM
Ответ:
Anonymous Quiz
35%
1
17%
2
39%
3
9%
4
3
👩‍💻 Что такое VarHandle в Java и зачем он нужен?

VarHandle — это современный API для низкоуровневого доступа к переменным, добавленный в java.lang.invoke.

Он стал заменой устаревшим sun.misc.Unsafe и предоставляет безопасный способ управлять памятью и синхронизацией.


С помощью VarHandle можно:

• работать с полями, массивами и элементами буферов напрямую
• выполнять атомарные операции (compareAndSet, getAndAdd)
• управлять видимостью изменений через разные memory ordering (plain, acquire, release, opaque)

⚡️ Пример:

import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;

public class Main {
private volatile int counter = 0;
private static VarHandle COUNTER;

static {
try {
COUNTER = MethodHandles.lookup()
.in(Main.class)
.findVarHandle(Main.class, "counter", int.class);
} catch (Exception e) {
throw new RuntimeException(e);
}
}

public void increment() {
COUNTER.getAndAdd(this, 1); // атомарное увеличение
}

public static void main(String[] args) {
Main obj = new Main();
obj.increment();
System.out.println(obj.counter); // ➔ 1
}
}


👀 VarHandle особенно полезен при написании неблокирующих структур данных, реализации своих синхронизаторов или оптимизированных кэшей, где важна гибкость и контроль над моделью памяти


➡️ Easy Java | #Теория
Please open Telegram to view this post
VIEW IN TELEGRAM
4
📖 Утилита Find и регулярные выражения

Разбираю, почему регулярки в find не работают «как везде»: синтаксис, ключи, примеры поиска IP и дат. Покажу рабочие паттерны, грабли и ссылки на самообучение.

Читать статью

➡️ Easy Java | #Статья
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Что такое Phaser в Java и зачем он нужен?

Phaser — это продвинутый синхронизатор из пакета java.util.concurrent, который можно рассматривать как улучшенную версию CountDownLatch и CyclicBarrier.

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


• Поддерживает несколько фаз синхронизации
• Позволяет добавлять/убирать потоки "на лету"
• Гибче, чем CountDownLatch и CyclicBarrier

⚡️ Пример:

import java.util.concurrent.Phaser;

public class Main {
public static void main(String[] args) {
Phaser phaser = new Phaser(3); // 3 потока-участника

Runnable task = () -> {
System.out.println(Thread.currentThread().getName() + " — фаза 1");
phaser.arriveAndAwaitAdvance(); // ждём остальных

System.out.println(Thread.currentThread().getName() + " — фаза 2");
phaser.arriveAndAwaitAdvance(); // ждём остальных
};

new Thread(task, "Поток-1").start();
new Thread(task, "Поток-2").start();
new Thread(task, "Поток-3").start();
}
}


👀 Phaser особенно полезен в сценариях с несколькими этапами работы (pipeline, симуляции, пошаговые модели), где потоки должны переходить к следующему шагу синхронно


➡️ Easy Java | #Теория
Please open Telegram to view this post
VIEW IN TELEGRAM
6
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔11😁4
Вопрос с собеса

Что произойдёт, если в Java вызвать System.exit()?

Пример🔽
public class Main {
public static void main(String[] args) {
try {
System.out.println("Начало работы");
System.exit(0);
System.out.println("Этот код не выполнится");
} finally {
System.out.println("И этот тоже"); // не будет выведен
}
}
}


Ответ🔽
System.exit() немедленно завершает работу JVM, останавливая все потоки, включая демоны. При этом:

— Все блоки finally и shutdown hooks могут не выполниться, если вызвать Runtime.getRuntime().halt() или если ОС аварийно завершает процесс.
— Код после System.exit() никогда не выполняется.
— Аргумент метода (0 или ненулевое значение) используется как код возврата процесса в ОС.

📌 Обычно System.exit() применяют в утилитах, CLI-программах или при фатальных ошибках, но в серверных приложениях лучше использовать корректное завершение с shutdown hooks


➡️ Easy Java | #Собес
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Please open Telegram to view this post
VIEW IN TELEGRAM
Ответ:
Anonymous Quiz
13%
1
19%
2
47%
3
20%
4
👩‍💻 Что такое Phaser в Java и зачем он нужен?

Phaser — это продвинутый синхронизатор из java.util.concurrent, который позволяет потокам координироваться по фазам выполнения.

В отличие от CountDownLatch и CyclicBarrier, он гибче: количество участников можно динамически добавлять и убирать.


• Поддерживает несколько фаз
• Гибко управляет количеством потоков
• Удобен для пошаговых алгоритмов

⚡️ Пример:

import java.util.concurrent.Phaser;

public class Main {
public static void main(String[] args) {
Phaser phaser = new Phaser(3);

Runnable task = () -> {
System.out.println(Thread.currentThread().getName() + " — фаза 1");
phaser.arriveAndAwaitAdvance();
System.out.println(Thread.currentThread().getName() + " — фаза 2");
};

new Thread(task).start();
new Thread(task).start();
new Thread(task).start();
}
}


👀 Phaser особенно полезен для задач с несколькими этапами синхронизации — например, симуляций, параллельных вычислений или координации батчевых операций


➡️ Easy Java | #Теория
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣21👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
6