Easy Java
رفتن به کانال در Telegram
Лучшие обучающие материалы и другие полезности для Java-разработчиков. Сотрудничество: @heywan_n1 Цены: @heywan_media Реклама на бирже: https://telega.in/c/+r8kkGSypBY84MmIy
نمایش بیشتر5 220
مشترکین
-124 ساعت
-237 روز
-8730 روز
آرشیو پست ها
5 220
Как вы решаете вопрос с покрытием?
Почти в каждом проекте висит задача: поднять покрытие до 70%.
И почти в каждой команде никто не хочет этим заниматься.
Explyt – AI-плагин для Java и Kotlin разработчиков, который снимает эту боль.
Он генерирует юнит-тесты прямо в IDE: по коду, по runtime-трассам, по спекам. И делает это так, как будто реально вник в проект.
📌 Что умеет:
- создаёт осмысленные тесты для Java и Kotlin-кода
- поддерживает JUnit 4/5, TestNG, кастомные фреймворки
- превращает execution trace в автотесты
- предлагает фиксы, если сгенерированный тест падает
- есть режим агента, где AI сам меняет код, запускает тесты и ищет ошибки
📦 Плагин доступен:
- через JetBrains Marketplace
- или напрямую с сайта разработчика
🎁 30 дней бесплатного доступа – просто пользуйтесь.
👉 Попробовать на своём проекте
5 220
❓ Вопрос с собеса
Что произойдёт, если в 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 | #Собес
5 220
🔥Приглашаем разработчиков на новый курс "Деплой микросервисов в Kubernetes. Helm"!
По ранней цене, в несколько раз ниже стоимости аналогичных программ на рынке (обычно от 40 000 до 100 000 рублей)!
Вместе с вами мы:
✅ разберём ключевые концепции деплоя микросервисов в кластер
✅ потренируемся с развёртыванием тестовых контейнеров
✅ подготовим production-ready манифесты и Helm-чарты для полноценного приложения: 6 бизнесовых микросервисов и 10 инфраструктурных компонентов (Loki, Tempo, Grafana, Keycloak, Kafka, Kafka Connect, Confluent Schema Registry, Redis, Postgres)
🔥 В результате обучения у вас будет не только понимание принципов, но и опыт в развертывании в кластере Kubernetes крупного проекта. После прохождения выдается электронный сертификат об окончании курса
Получи полноценный опыт Middle|Senior разработчика
➕ Доступен выгодный пакет с курсом Java Микросервисы, Kafka, Docker, Spring Cloud, Spring WebFlux
5 220
👩💻 Что такое 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 | #Теория
5 220
📖 Утилита Find и регулярные выражения
Разбираю, почему регулярки в find не работают «как везде»: синтаксис, ключи, примеры поиска IP и дат. Покажу рабочие паттерны, грабли и ссылки на самообучение.
⛓ Читать статью
➡️ Easy Java | #Статья.
5 220
👩💻 Что такое
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 | #Теория
5 220
🤨Кто-то всё еще закидывает на Steam, переплачивая за комиссию?
Пользователи Kupikod Premium уже даже не вспоминают это слово, потому что пополняют Steam БЕЗ комиссии, то есть 1к1, рубль в рубль:
Заплатил 1000 рублей — получишь на баланс тоже 1000 рублей
Подготовься к осенней распродаже Steam как следует — oформляй Kupikod Premium и забудь про слово комиссия вообще!
5 220
❓ Вопрос с собеса
Что такое 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 | #Собес
5 220
Продуктивная пятница для тех кто в теме Java и ML – приходите на VK JT Meetup!
3 октября VK проводит VK JT Meetup в Нижнем — офлайн-встречу ML-инженеров и Java-разработчиков.
Лиды VK расскажут про вызовы перед бэкендером, которые возникают в процессе создания B2B-продукта. А также поделятся пошаговым гайдом по выпуску RAG в прод и процессом создания единой инфраструктуры поисковой платформы.
А после докладов вас ждут командные кейс-батлы и нетворкинг.
Приходите посоревноваться за призы в кейс-батле и пообщаться с экспертами в нетворкинг-зоне.
📍 Нижний Новгород, только офлайн
📅 3 октября, сбор с 18:00
🎟 Вход по регистрации
5 220
📖 Обмен событиями распределённого приложения на Java
Сегодня я хочу рассказать вам об одном из вариантов доставки событий для распределённого приложения на Java.
Это доставка событий через БД, в которой хранится состояние распределённого приложения.⛓ Читать статью ➡️ Easy Java | #Статья
5 220
👩💻 Что такое StampedLock в Java и зачем он нужен?
StampedLock — это продвинутый механизм синхронизации из пакета
java.util.concurrent.locks, созданный как альтернатива ReentrantReadWriteLock.
Он предоставляет три режима блокировки: • эксклюзивная (write lock) • совместная (read lock) • оптимистичная (optimistic read), которая не блокирует ресурс и подходит для случаев, где конфликты редки. Вместо объектов-блокировок StampedLock работает с "штампами" (stamp) — уникальными long-значениями, которые нужно передавать при освобождении блокировки• Позволяет снизить блокировки при частых чтениях • Поддерживает неблокирующие "оптимистичные" чтения • Эффективнее для высоконагруженных многопоточных приложений ⚡️ Пример:
import java.util.concurrent.locks.StampedLock;
public class Main {
private static final StampedLock lock = new StampedLock();
private static int value = 0;
public static void main(String[] args) {
// Запись
long stamp = lock.writeLock();
try {
value = 42;
} finally {
lock.unlockWrite(stamp);
}
// Оптимистичное чтение
long optStamp = lock.tryOptimisticRead();
int readValue = value;
if (!lock.validate(optStamp)) {
long readStamp = lock.readLock();
try {
readValue = value;
} finally {
lock.unlockRead(readStamp);
}
}
System.out.println("Прочитано: " + readValue);
}
}
👀 StampedLock особенно полезен в сценариях с частыми чтениями и редкими записями, например, в кэшах, аналитических сервисах или многопоточных коллекциях, где важна высокая производительность при одновременном доступе➡️ Easy Java | #Теория
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
