Please open Telegram to view this post
VIEW IN TELEGRAM
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 особенно полезен в сценариях с частыми чтениями и редкими записями, например, в кэшах, аналитических сервисах или многопоточных коллекциях, где важна высокая производительность при одновременном доступе
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
Сегодня я хочу рассказать вам об одном из вариантов доставки событий для распределённого приложения на Java.
Это доставка событий через БД, в которой хранится состояние распределённого приложения.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁11🤔3❤2🔥1
Что такое 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, поэтому их нельзя использовать для критически важных операций (например, записи в БД).
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
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