|
2026-03-31 18:12:49
|
Как получить гарантированный дедлок?
Сначала поговорим о том, что это такое. Deadlock – это взаимная блокировка, ситуация, когда два или более потока «наступают друг-другу на хвост» – зависают в вечном ожидании ресурсов, захваченных друг другом.
Livelock – похожая проблема, с тем лишь отличием, что потоки не останавливаются, а вместо этого зацикливаются, выполняя одни и те же бесполезные действия, ходят по кругу.
Стандартный подход к обеспечению гарантии защиты от дедлока – установка строгого порядка взятия блокировок. Если для мониторов A и B соблюдается всеобщий порядок захвата AB (и соответственно отпускания BA), то ни с одним потоком не случится попасть на ожидание B, успешно при этом захватив A.
Из этого можно догадаться, простой способ гарантировать возможность дедлока – явно нарушить это условие.
Нарушение условия даст дедлок «скорее всего когда-нибудь». Чтобы получить его точно и с первого раза, нужно гарантировать, что оба потока окажутся на этапе между захватами одного и другого ресурса в одно время. Это можно сделать множеством способов, в примере ниже использован CyclicBarrier.
Как получить гар…
|
—
|
|
122
|
|
2026-03-31 13:14:02
|
Магия IntelliJ IDEA: Extend Selection
Нужно выделить метод целиком? Или весь блок try-catch? Или параметры метода? Обычно хватаешься за мышку и начинаешь аккуратно тащить курсор, рискуя промазать. А потом выделяешь заново, потому что захватил лишнюю скобку. Но можно лучше.
🟢Что делает
— Умно расширяет выделение от курсора по синтаксическим границам кода
— Понимает структуру Java: слово → выражение → statement → блок → метод → класс
— Работает в обратную сторону: сужает выделение обратно по тем же границам
— Учитывает контекст: для строк расширяет от слова до всей строки, для вызовов — от аргумента до всего вызова
🟢 Зачем это нужно
— Выделяете нужный фрагмент за 2-3 нажатия вместо возни с мышкой
— Безошибочно выделяете сложные конструкции: цепочки вызовов, лямбды, generic-типы
— Идеально для последующего Extract Method, Copy-Paste, или Delete
— Особенно мощно для вложенных структур: легко выделить внутренний if в try внутри цикла
— Ускоряет рефакторинг: выделил логичный кусок → Extract → готово
🟢 Как использовать
— Поставьте курсор внутри нужного фрагмента (на переменную, в середину выражения, в метод)
— Нажмите Ctrl+W (Windows/Linux) или ⌥+Up (macOS) — выделение расширится на уровень выше
— Нажимайте повторно, чтобы расширять дальше: переменная → выражение → строка → if-блок → метод → класс
— Для сужения обратно: Ctrl+Shift+W (Windows/Linux) или ⌥+Down (macOS)
Магия IntelliJ I…
|
—
|
|
206
|
|
2026-03-31 09:28:22
|
Микросервисы: как выбрать между синхронной блокировкой и событийной архитектурой?
Синхронные вызовы кажутся простыми и знакомыми, пока не превращаются в цепочки, которые рушат всю систему. Событийная архитектура выглядит элегантно, но таит подводные камни: что класть в событие? как быть с долгими операциями?
В статье вы найдёте:
▫️ живые примеры из реальных аварий (включая историю с бесконечными ретраями в очереди),
▫️ три готовые диаграммы в формате Mermaid, которые можно сразу использовать в документации,
▫️ чёткий алгоритм выбора стиля под вашу задачу.
Материал будет полезен архитекторам, ведущим разработчикам и всем, кто проектирует распределённые системы. Покажу, как не повторять ошибок, которые стоили компаниям миллионов.
Читать статью
Микросервисы: ка…
|
—
|
|
228
|
|
2026-03-30 18:37:20
|
Безопасная загрузка ресурсов в Java
Хитрый совет по Java: используй скрытую возможность ClassLoader для безопасной подгрузки конфигураций и плагинов.
Вместо чтения файлов напрямую через File, загружай ресурсы из classpath — так ты избежишь проблем с путями, правами и разными окружениями.
import java.io.*;
import java.nio.charset.*;
public class ConfigLoader {
public static String load(String name) throws Exception {
try (InputStream in =
ConfigLoader.class.getClassLoader().getResourceAsStream(name)) {
if (in == null) return null;
return new String(in.readAllBytes(), StandardCharsets.UTF_8);
}
}
public static void main(String[] args) throws Exception {
System.out.println(load("config/app.conf"));
}
}
Безопасная загру…
|
—
|
|
322
|
|
2026-03-30 09:55:56
|
Быстрый Java-совет: точное измерение времени с Instant и Duration
Если нужно замерить время выполнения кода с наносекундной точностью — используйте связку Instant + Duration из java.time.
✔️ Instant — фиксированная точка времени в UTC.
✔️ Duration — разница между двумя Instant (секунды, миллисекунды, наносекунды).
Пример:
Instant start = Instant.now();
// ваш код
Instant end = Instant.now();
Duration elapsed = Duration.between(start, end);
Быстрый Java-сов…
|
—
|
|
381
|
|
2026-03-29 13:36:37
|
Можно ли считать Final переменную константой?
Поскольку у нас не получится присвоить новое значение для final переменной, кажется, что это переменные константы. Но это только на первый взгляд. Если тип данных, на который ссылается переменная — immutable, то да, это константа.
А если тип данных mutable, то есть изменяемый, при помощи методов и переменных можно будет изменить значение объекта, на который ссылается final переменная, и в таком случае назвать ее константой нельзя. Так вот, на примере видно, что часть финальных переменных действительно константы, а часть — нет, и их можно изменить.
Можно ли считать…
|
—
|
|
377
|