Easy Java
前往频道在 Telegram
Лучшие обучающие материалы и другие полезности для Java-разработчиков. Сотрудничество: @heywan_n1 Цены: @heywan_media Реклама на бирже: https://telega.in/c/+r8kkGSypBY84MmIy
显示更多4 939
订阅者
+424 小时
-177 天
-1830 天
帖子存档
4 939
🔥Приглашаем разработчиков на новый курс "Деплой микросервисов в 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
4 939
👩💻 Что такое 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 | #Теория
4 939
📖 Утилита Find и регулярные выражения
Разбираю, почему регулярки в find не работают «как везде»: синтаксис, ключи, примеры поиска IP и дат. Покажу рабочие паттерны, грабли и ссылки на самообучение.
⛓ Читать статью
➡️ Easy Java | #Статья.
4 939
👩💻 Что такое
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 | #Теория
4 939
🤨Кто-то всё еще закидывает на Steam, переплачивая за комиссию?
Пользователи Kupikod Premium уже даже не вспоминают это слово, потому что пополняют Steam БЕЗ комиссии, то есть 1к1, рубль в рубль:
Заплатил 1000 рублей — получишь на баланс тоже 1000 рублей
Подготовься к осенней распродаже Steam как следует — oформляй Kupikod Premium и забудь про слово комиссия вообще!
4 939
❓ Вопрос с собеса
Что такое 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 | #Собес
4 939
Продуктивная пятница для тех кто в теме Java и ML – приходите на VK JT Meetup!
3 октября VK проводит VK JT Meetup в Нижнем — офлайн-встречу ML-инженеров и Java-разработчиков.
Лиды VK расскажут про вызовы перед бэкендером, которые возникают в процессе создания B2B-продукта. А также поделятся пошаговым гайдом по выпуску RAG в прод и процессом создания единой инфраструктуры поисковой платформы.
А после докладов вас ждут командные кейс-батлы и нетворкинг.
Приходите посоревноваться за призы в кейс-батле и пообщаться с экспертами в нетворкинг-зоне.
📍 Нижний Новгород, только офлайн
📅 3 октября, сбор с 18:00
🎟 Вход по регистрации
4 939
📖 Обмен событиями распределённого приложения на Java
Сегодня я хочу рассказать вам об одном из вариантов доставки событий для распределённого приложения на Java.
Это доставка событий через БД, в которой хранится состояние распределённого приложения.⛓ Читать статью ➡️ Easy Java | #Статья
4 939
👩💻 Что такое 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 | #Теория
4 939
👩💻 В сеть вывалилась гигантская куча курсов и книг от топовых IT‑школ
Держи сотни гигабайт свежих уроков, и каждую неделю мы подкидываем ещё!
• 1612 ГБ — DevOps
• 1402 ГБ — Python
• 1300 ГБ — C, C++
• 1815 ГБ — Frontend
• 1515 ГБ — Backend
• 898 ГБ — ИБ, Хакинг
• 996 ГБ — Kotlin, Swift
• 212 ГБ — JavaScript
• 315 ГБ — Flutter
• 820 ГБ — Go, PHP
• 419 ГБ — Java, Rust
• 648 ГБ — GameDev
• 517 ГБ — Windows, Linux
• 998 ГБ — Дизайн (UX/UI)
• 617 ГБ — Нейросети (ML/RL)
• 546 ГБ — БД (SQL & NoSQL)
• 687 ГБ — Аналитика данных
• 115 ГБ — QA-тестирование
Подписывайся и не плати за то, что можно получить бесплатно
