Easy Java
Ir al canal en Telegram
Лучшие обучающие материалы и другие полезности для Java-разработчиков. Сотрудничество: @heywan_n1 Цены: @heywan_media Реклама на бирже: https://telega.in/c/+r8kkGSypBY84MmIy
Mostrar más5 037
Suscriptores
-224 horas
-187 días
-7430 días
Archivo de publicaciones
5 037
👩💻 Что такое
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 037
🤨Кто-то всё еще закидывает на Steam, переплачивая за комиссию?
Пользователи Kupikod Premium уже даже не вспоминают это слово, потому что пополняют Steam БЕЗ комиссии, то есть 1к1, рубль в рубль:
Заплатил 1000 рублей — получишь на баланс тоже 1000 рублей
Подготовься к осенней распродаже Steam как следует — oформляй Kupikod Premium и забудь про слово комиссия вообще!
5 037
❓ Вопрос с собеса
Что такое 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 037
Продуктивная пятница для тех кто в теме Java и ML – приходите на VK JT Meetup!
3 октября VK проводит VK JT Meetup в Нижнем — офлайн-встречу ML-инженеров и Java-разработчиков.
Лиды VK расскажут про вызовы перед бэкендером, которые возникают в процессе создания B2B-продукта. А также поделятся пошаговым гайдом по выпуску RAG в прод и процессом создания единой инфраструктуры поисковой платформы.
А после докладов вас ждут командные кейс-батлы и нетворкинг.
Приходите посоревноваться за призы в кейс-батле и пообщаться с экспертами в нетворкинг-зоне.
📍 Нижний Новгород, только офлайн
📅 3 октября, сбор с 18:00
🎟 Вход по регистрации
5 037
📖 Обмен событиями распределённого приложения на Java
Сегодня я хочу рассказать вам об одном из вариантов доставки событий для распределённого приложения на Java.
Это доставка событий через БД, в которой хранится состояние распределённого приложения.⛓ Читать статью ➡️ Easy Java | #Статья
5 037
👩💻 Что такое 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 | #Теория
5 037
👩💻 В сеть вывалилась гигантская куча курсов и книг от топовых 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-тестирование
Подписывайся и не плати за то, что можно получить бесплатно
5 037
❓ Вопрос с собеса
Что такое 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 | #Собес
5 037
Подборка каналов IT от наших друзей:
🦥 Lazy_Programmer – Для ленивых
🎬 videos_it — База видеоуроков по IT
🐧 Linux_Club — Для Linuxоидов
📔 BOOKS — Читать не перечитать
🇷🇺 our_computer — У нас как в СССР
🔐 LazySecurity — Канал по ИБ
🤩 iwannabeprogrammer — IT-мемы
🔥 floppydisky — ITUMOR
📱 codebase_frontend — Красим кнопки
➡️ LazyDevOps — Канал для дев и псов
🐈⬛️ LazyTester — Протестируй канал!
5 037
❓ Вопрос с собеса
Что такое 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 | #Собес
5 037
🤔 Слишком поздно заходить в IT в 2025?
Врать не буду, скорее да, чем нет: за последние пять лет порог вхождения сильно поднялся, и теперь нередко от джуна требуют навыки грейдом выше.
Что делать в такой ситуации? Учиться эффективнее остальных и знать, как подать себя на рынке других. Разобраться со всем этим вам поможет База Знаний — место, где за вас уже отобрали лучшие материалы по самым востребованным вакансиям:
🖥 Python Dev – 1558+ материалов
👩💻 Frontend Dev – 1241+ материалов
👩💻 Backend Dev – 1095+ материалов
📊 Data Scientist – 978+ материалов
🎨 UX/UI Designer – 885+ материалов
🤖 Нейросети – 824+ материалов
📖 Книги по IT – 779+ материалов
Советую перейти и начать учиться уже сейчас — так уже через пару месяцев сможете претендовать на вакансию c хорошим окладом 👍
