en
Feedback
Easy Java

Easy Java

Open in Telegram

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

Show more
5 037
Subscribers
-224 hours
-187 days
-7430 days
Posts Archive
👩‍💻 Что такое 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 | #Теория

Ответ:
Anonymous voting

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

Вопрос с собеса Что такое Callable в Java и чем он отличается от Runnable? Пример🔽
import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();

        Callable<Integer> task = () -> {
            Thread.sleep(500);
            return 7 * 6;
        };

        Future<Integer> future = executor.submit(task);
        System.out.println("Результат: " + future.get()); // ➔ 42

        executor.shutdown();
    }
}
Ответ🔽
Runnable — это интерфейс для задач, которые выполняются в отдельном потоке, но не возвращают результат и не могут выбрасывать проверяемые исключения. Callable<V> — это интерфейс для задач, которые возвращают результат (V) и могут выбрасывать исключения. 📌 Основные отличия: — Runnable.run() → void, без checked-исключений — Callable.call() → V, может выбросить checked-исключения — Callable всегда используется вместе с Future для получения результата
➡️ Easy Java | #Собес

Подборка каналов IT от наших друзей: 🦥 Lazy_Programmer – Для ленивых 🎬 videos_it  — База видеоуроков по IT 🐧 Linux_Club — Для Linuxоидов 📔 BOOKS — Читать не перечитать 🇷🇺 our_computer — У нас как в СССР 🔐 LazySecurity — Канал по ИБ 🤩 iwannabeprogrammer  — IT-мемы 🔥 floppydisky — ITUMOR 📱 codebase_frontend — Красим кнопки ➡️ LazyDevOps —  Канал для дев и псов 🐈‍⬛️ LazyTester — Протестируй канал!

Вопрос с собеса Что такое Callable в Java и чем он отличается от Runnable? Пример🔽
import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();

        Callable<Integer> task = () -> {
            Thread.sleep(500);
            return 7 * 6;
        };

        Future<Integer> future = executor.submit(task);
        System.out.println("Результат: " + future.get()); // ➔ 42

        executor.shutdown();
    }
}
Ответ🔽
Runnable — это интерфейс для задач, которые выполняются в отдельном потоке, но не возвращают результат и не могут выбрасывать проверяемые исключения. Callable<V> — это интерфейс для задач, которые возвращают результат (V) и могут выбрасывать исключения. 📌 Основные отличия: — Runnable.run() → void, без checked-исключений — Callable.call() → V, может выбросить checked-исключения — Callable всегда используется вместе с Future для получения результата
➡️ Easy Java | #Собес

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

🤔 Слишком поздно заходить в IT в 2025? Врать не буду, скорее да, чем нет: за последние пять лет порог вхождения сильно поднялся, и теперь нередко от джуна требуют навыки грейдом выше. Что делать в такой ситуации? Учиться эффективнее остальных и знать, как подать себя на рынке других. Разобраться со всем этим вам поможет База Знаний — место, где за вас уже отобрали лучшие материалы по самым востребованным вакансиям: 🖥 Python Dev – 1558+ материалов 👩‍💻 Frontend Dev – 1241+ материалов 👩‍💻 Backend Dev – 1095+ материалов 📊 Data Scientist – 978+ материалов 🎨 UX/UI Designer – 885+ материалов 🤖 Нейросети – 824+ материалов 📖 Книги по IT – 779+ материалов Советую перейти и начать учиться уже сейчас — так уже через пару месяцев сможете претендовать на вакансию c хорошим окладом 👍

Ответ:
Anonymous voting