TGViewer
Прогревочная Прогревочная @pro_grevy · 395 subscribers
Post #68 554
А вот и разбор первой части! Спасибо всем, кто оставлял свои решения и мысли в комментариях. На мой взгляд, основная трудность тут состоит в том, что надо придумать исправление именно в одну строку.

Подвох первой задачи состоит в правиле вывода типов для тернарной операции, тип будет примитивным, из-за чего возникнет NPE при анбоксинге

Вторая задача эксплуатирует известную особенность функции Math.abs - она возвращает отрицательное число для минимально возможного значения int

Третья задача сделана по мотивам моей статьи про обработку Unicode в Java. Со строками можно работать на разных уровнях: отдельных байтов, двухбайтовых char в Java, codepoint-ов и графем. Их не надо путать между собой

Четвертый паззлер - известный баян про removeIf, но тут основная задача была придумать минимально рабочую починку именно в одну строку. Изначально я предполагал только вариант 1: использовать коллекцию, которая поддерживает конкурентные изменения. Но на конференции один из участников придумал вариант 2: копировать коллекцию при итерировании

Пятая задача требует понимания логики инициализации классов. Во время инициализации JVM помечает класс как инициализируемый текущим потоком. Если в этот момент другие потоки пытаются получить доступ к этому классу (полям, функциям и т.д.), они будут ждать окончания инициализации.

Здесь мы вычисляем статическое поле через parallel stream, поэтому часть работы уходит в другие потоки. Эти потоки пытаются выполнить лямбду, которая передаётся в filter(...). Эта лямбда скомпилирована как часть класса, который сейчас инициализируется

В итоге получается дедлок: основной поток не закончит инициализацию, пока не вычислится статическое поле, а потоки не смогут сделать свою работу, пока основной поток не завершит инициализацию всего класса.

Вывод: в статической инициализации нельзя запускать логику работы инициализации, если эта работа сама зависит от инициализируемого класса. Поэтому для починки в одну строку делаем все через .sequential()

Это были первые пять задач-пазлеров, а в следующее воскресенье ждите вторую часть 😀
  • 🔥 13
  • ❤ 1
More from @pro_grevy
  1. Aug 19, 2026Мой соратник по алготрейдинговым делам прошлого, спикер и просто хороший человек, Сергей М…
  2. Jul 28, 2026Post #85
  3. Jun 30, 2026#вайбкуколдинг Чеклист продвинутого погромиста: ✅ Решать все задачи с помощью LLM ✅ Закомм…
  4. Jun 30, 2026Вы таки будете смеяться, но ведь этот однострочник и правда работает неправильно ⬇️⬇️⬇️ На…
  5. Jun 22, 2026Вышли записи докладов с SnowOne 2026, в том числе и мой, где я сравниваю GC в Java и Go. Д…
  6. May 14, 2026https://habr.com/ru/articles/1033788 tldr: одна из субличностей ChatGPT заболела гоблинома…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →