ch
Feedback
Easy Java

Easy Java

前往频道在 Telegram

Лучшие обучающие материалы и другие полезности для Java-разработчиков. Сотрудничество: @heywan_n1 Цены: @heywan_media Реклама на бирже: https://telega.in/c/+r8kkGSypBY84MmIy

显示更多
5 220
订阅者
-124 小时
-237
-8730
帖子存档
➡️ Easy Java | #Викторина
➡️ Easy Java | #Викторина

Как вы решаете вопрос с покрытием? Почти в каждом проекте висит задача: поднять покрытие до 70%. И почти в каждой команде ник
Как вы решаете вопрос с покрытием? Почти в каждом проекте висит задача: поднять покрытие до 70%. И почти в каждой команде никто не хочет этим заниматься. Explyt – AI-плагин для Java и Kotlin разработчиков, который снимает эту боль. Он генерирует юнит-тесты прямо в IDE: по коду, по runtime-трассам, по спекам. И делает это так, как будто реально вник в проект. 📌 Что умеет: - создаёт осмысленные тесты для Java и Kotlin-кода - поддерживает JUnit 4/5, TestNG, кастомные фреймворки - превращает execution trace в автотесты - предлагает фиксы, если сгенерированный тест падает - есть режим агента, где AI сам меняет код, запускает тесты и ищет ошибки 📦 Плагин доступен: - через JetBrains Marketplace - или напрямую с сайта разработчика 🎁 30 дней бесплатного доступа – просто пользуйтесь. 👉 Попробовать на своём проекте

Вопрос с собеса Что произойдёт, если в 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 | #Собес

🔥Приглашаем разработчиков на новый курс "Деплой микросервисов в Kubernetes. Helm"! По ранней цене, в несколько раз ниже стои
🔥Приглашаем разработчиков на новый курс "Деплой микросервисов в 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

➡️ Easy Java | #Мемы
➡️ Easy Java | #Мемы

Ответ:
Anonymous voting

➡️ Easy Java | #Викторина
➡️ Easy Java | #Викторина

👩‍💻 Что такое 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 | #Теория

📖 Утилита Find и регулярные выражения Разбираю, почему регулярки в find не работают «как везде»: синтаксис, ключи, примеры п
📖 Утилита Find и регулярные выражения Разбираю, почему регулярки в find не работают «как везде»: синтаксис, ключи, примеры поиска IP и дат. Покажу рабочие паттерны, грабли и ссылки на самообучение. ⛓ Читать статью ➡️ Easy Java | #Статья.

👩‍💻 Что такое 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 | #Теория

🤨Кто-то всё еще закидывает на Steam, переплачивая за комиссию? Пользователи Kupikod Premium уже даже не вспоминают это слово
🤨Кто-то всё еще закидывает на Steam, переплачивая за комиссию? Пользователи Kupikod Premium уже даже не вспоминают это слово, потому что пополняют Steam БЕЗ комиссии, то есть 1к1, рубль в рубль: Заплатил 1000 рублей — получишь на баланс тоже 1000 рублей Подготовься к осенней распродаже Steam как следует — oформляй Kupikod Premium и забудь про слово комиссия вообще!

Ответ:
Anonymous voting

➡️ Easy Java | #Викторина
➡️ Easy Java | #Викторина

Вопрос с собеса Что такое 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 | #Собес

Продуктивная пятница для тех кто в теме Java и ML – приходите на VK JT Meetup! 3 октября VK проводит VK JT Meetup в Нижнем —
Продуктивная пятница для тех кто в теме Java и ML – приходите на VK JT Meetup! 3 октября VK проводит VK JT Meetup в Нижнем — офлайн-встречу ML-инженеров и Java-разработчиков. Лиды VK расскажут про вызовы перед бэкендером, которые возникают в процессе создания B2B-продукта. А также поделятся пошаговым гайдом по выпуску RAG в прод и процессом создания единой инфраструктуры поисковой платформы. А после докладов вас ждут командные кейс-батлы и нетворкинг. Приходите посоревноваться за призы в кейс-батле и пообщаться с экспертами в нетворкинг-зоне. 📍 Нижний Новгород, только офлайн 📅 3 октября, сбор с 18:00 🎟 Вход по регистрации

➡️ Easy Java | #Мемы
➡️ Easy Java | #Мемы

Ответ:
Anonymous voting

➡️ Easy Java | #Викторина
➡️ Easy Java | #Викторина

📖 Обмен событиями распределённого приложения на Java Сегодня я хочу рассказать вам об одном из вариантов доставки событий дл
📖 Обмен событиями распределённого приложения на Java Сегодня я хочу рассказать вам об одном из вариантов доставки событий для распределённого приложения на Java.
Это доставка событий через БД, в которой хранится состояние распределённого приложения.
Читать статью ➡️ Easy Java | #Статья

👩‍💻 Что такое 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 | #Теория