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 особенно полезен при написании неблокирующих структур данных, реализации своих синхронизаторов или оптимизированных кэшей, где важна гибкость и контроль над моделью памяти
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Разбираю, почему регулярки в find не работают «как везде»: синтаксис, ключи, примеры поиска IP и дат. Покажу рабочие паттерны, грабли и ссылки на самообучение.
Please open Telegram to view this post
VIEW IN TELEGRAM
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, симуляции, пошаговые модели), где потоки должны переходить к следующему шагу синхронно
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔11😁4
Что произойдёт, если в 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
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Please open Telegram to view this post
VIEW IN TELEGRAM
Phaser — это продвинутый синхронизатор из
java.util.concurrent, который позволяет потокам координироваться по фазам выполнения.В отличие от CountDownLatch и CyclicBarrier, он гибче: количество участников можно динамически добавлять и убирать.
• Поддерживает несколько фаз
• Гибко управляет количеством потоков
• Удобен для пошаговых алгоритмов
import java.util.concurrent.Phaser;
public class Main {
public static void main(String[] args) {
Phaser phaser = new Phaser(3);
Runnable task = () -> {
System.out.println(Thread.currentThread().getName() + " — фаза 1");
phaser.arriveAndAwaitAdvance();
System.out.println(Thread.currentThread().getName() + " — фаза 2");
};
new Thread(task).start();
new Thread(task).start();
new Thread(task).start();
}
}
👀 Phaser особенно полезен для задач с несколькими этапами синхронизации — например, симуляций, параллельных вычислений или координации батчевых операций
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣2❤1👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6
Что такое ClassLoader в Java и как он работает?
Пример
public class Main {
public static void main(String[] args) {
ClassLoader loader = Main.class.getClassLoader();
System.out.println("ClassLoader: " + loader);
System.out.println("Parent: " + loader.getParent());
System.out.println("Grandparent: " + loader.getParent().getParent()); // ➔ null (Bootstrap)
}
}Ответ
ClassLoader отвечает за загрузку классов в память JVM. Он превращает байткод (.class файлы) в объекты Class во время выполнения.
Загрузка происходит каскадно — через цепочку загрузчиков:
Bootstrap ClassLoader — загружает базовые классы JDK (java.lang.*, java.util.*)
Platform (или Extension) ClassLoader — загружает расширения из jmods
Application ClassLoader — загружает классы приложения из classpath
📌 Можно создать свой ClassLoader для динамической подгрузки плагинов, изоляции зависимостей или перезапуска модулей без перезапуска JVM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔5❤2
Please open Telegram to view this post
VIEW IN TELEGRAM
ReentrantReadWriteLock — это улучшенная альтернатива synchronized, позволяющая одновременно выполнять несколько чтений, но блокировать доступ на запись.
Он состоит из двух независимых замков:
• readLock() — совместимый, позволяет многим потокам читать параллельно
• writeLock() — эксклюзивный, разрешает только одному потоку писать
import java.util.concurrent.locks.*;
public class Main {
private static final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private static int value = 0;
public static void main(String[] args) {
Runnable reader = () -> {
lock.readLock().lock();
try {
System.out.println("Чтение: " + value);
} finally {
lock.readLock().unlock();
}
};
Runnable writer = () -> {
lock.writeLock().lock();
try {
value++;
System.out.println("Запись: " + value);
} finally {
lock.writeLock().unlock();
}
};
new Thread(reader).start();
new Thread(writer).start();
}
}
👀 ReentrantReadWriteLock особенно полезен, когда чтений гораздо больше, чем записей — например, в кэшах, справочниках или аналитических сервисах
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2