Java Guru 🤓

channel icon
Канал с вопросами и задачами с собеседований!

Условия размещения

Цена за 48 часов в ленте 3500,00
Цена за 1 час закрепления N/A
Взаимопиар Нет
Дополнительные условия рекламы Отсутствуют
-4
12 317
подписчиков
+34
~2.3k
охват 1 публикации
0
~3
постов / день
+0,3%
18,5%
ERR % ?

Статистика

Последние публикации

Java Guru 🤓
4 мая 2024 г. 14:30
🧠 Улучши ИИ на хакатоне X5 Tech AI Hack! У тебя будет 10 дней, чтобы избавить нейросеть от галлюцинаций и научить ее работать с конфиденциальными данными. Призовой фонд от X5 Tech – 2 000 000 рублей.

Старт ML-соревнования – 17 мая. Не жди дедлайна, регистрируйся прямо сейчас: https://cnrlink.com/x5techaihackjavaguru

На выбор – один из двух треков:
1️⃣ Маскирование. Предстоит разработать алгоритм, который будет заменять чувствительные данные в датасете без потери смысла.
2️⃣ Детекция галлюцинаций. Задача конкурсантов – создать систему, которая сможет эффективно выявлять аномалии в тексте, сгенерированном нейросетью.

28-29 мая 5 лучших команд в каждом треке получат приглашение на финал в Москве. Церемония награждения пройдет на X5 Future Night.

Участвуй в X5 Tech AI Hack и внеси свой вклад в развитие ML-технологий: https://cnrlink.com/x5techaihackjavaguru

Реклама. ООО «ИТ ИКС 5 Технологии». ИНН 1615014289. erid: LjN8JtteF
Java Guru 🤓
4 мая 2024 г. 11:15
Как получить гарантированный дедлок?

Сначала поговорим о том, что это такое. Deadlock – это взаимная блокировка, ситуация, когда два или более потока «наступают друг-другу на хвост» – зависают в вечном ожидании ресурсов, захваченных друг другом.

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

Стандартный подход к обеспечению гарантии защиты от дедлока – установка строгого порядка взятия блокировок. Если для мониторов A и B соблюдается всеобщий порядок захвата AB (и соответственно отпускания BA), то ни с одним потоком не случится попасть на ожидание B, успешно при этом захватив A.

Из этого можно догадаться, простой способ гарантировать возможность дедлока – явно нарушить это условие.

Нарушение условия даст дедлок «скорее всего когда-нибудь». Чтобы получить его точно и с первого раза, нужно гарантировать, что оба потока окажутся на этапе между захватами одного и другого ресурса в одно время. Это можно сделать множеством способов, в примере ниже использован CyclicBarrier.
Java Guru 🤓
3 мая 2024 г. 15:51
Java Guru 🤓
3 мая 2024 г. 15:51
Java Guru 🤓
3 мая 2024 г. 15:51
Java Guru 🤓
3 мая 2024 г. 15:51
Java Guru 🤓
3 мая 2024 г. 15:51
Java Guru 🤓
3 мая 2024 г. 15:51
Java Guru 🤓
3 мая 2024 г. 15:51
Erid: 2VtzqxkzjSZ

👋 Тебя приглашают в Росбанк IT Team

Привет, мы ИТ-команда Росбанка! Познакомься со стеком наших Java-разработчиков. Есть что-то незнакомое? Это нестрашно — всему научим!

А пока подпишись на телеграм-канал Росбанк IT Teamтелеграм-канал Росбанк IT Team. Там мы:
🔸делимся экспертизой, рассказываем о последних трендах и раскрываем секреты разработки продуктов;
🔸знакомим с нашей корпоративной культурой;
🔸публикуем актуальные вакансии с полной удаленкой: у нас есть предложения, от которых ты не сможешь отказаться.

👉 Подпишись на Росбанк IT TeamРосбанк IT Team и стань частью нашего крутого сообщества!

Реклама. ПАО "Росбанк" ИНН 7730060164
Java Guru 🤓
3 мая 2024 г. 9:48
Как в лямбде изменить внешнюю локальную переменную?

Это нельзя сделать в лоб. Такой код не скомпилируется, потому что захваченная локальная переменная обязана быть effectively final. Такое требование исходит из следующих причин.

Локальная переменная хранится на стеке, а значит время ее жизни в отличие от долгоживущих элементов хипа ограничено скоупом и текущим потоком. Но экземпляр лямбды, захвативший эту переменную, мог бы быть передан наружу и использован для доступа к этой переменной из другого потока и после выхода из метода.

Эта проблема решается тем, что в лямбду копируется значение локальной переменной. Такая копия живет независимо, возможно дольше оригинала. Но это решение приведет к сложному поведению из-за возможности работы с неактуальным значением – копия и оригинал станут двумя разными переменными. Поэтому значение должно быть вечно актуально – неизменяемо.

Поля экземпляра менять можно, потому что захваченной переменной в этом случае выступает effectively final значение this.

Если локальную переменную всё же хочется изменить, решение очевидно – поместить её в кучу. Для этого нужно использовать любого рода обертку: одноэлементный массив, объект-atomic, специально созданный класс с этой переменной как полем.

Хак с оберткой решает проблему времени жизни и даёт коду скомпилироваться, но возвращает проблему сложности поведения. Если среда многопоточная, то вероятно порядок операций с этой переменной придется синхронизировать вручную.
Java Guru 🤓
1 мая 2024 г. 13:00
👩‍💻 Тест по Java от OTUSТест по Java от OTUS



Проверь насколько хорошо ты знаешь Java и готов освоить Spring!

Ответишь — пройдешь на продвинутый курс "Разработчик на Spring Framework" от OTUS по специальной цене.

👉 ПРОЙТИ ТЕСТ: https://otus.pw/swHj/

🎫 Курс можно приобрести в рассрочку

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Java Guru 🤓
1 мая 2024 г. 8:44
Какими коллекциями пользоваться в многопоточной среде?

Первый вариант – превратить в синхронизированную обычную коллекцию, вызвав соответствующий ее типу метод Collections.synchronized*(). Самый общий и самый примитивный способ, создает обертку с синхронизацией всех операций с помощью synchronized.

Если работа с коллекцией состоит в основном из чтения, лучшая в плане производительности альтернатива – CopyOnWriteArrayList, и содержащий его в реализации CopyOnWriteArraySet. Потокобезопасность достигается копированием внутреннего массива при любой модификации, оригинальный массив остается immutable. Program order достигается модификатором volatile на внутреннем массиве.

Третий вариант – использование Concurrent-коллекций:
🔘 Неблокирующие хэш-таблицы ConcurrentSkipListMap, ConcurrentHashMap и ConcurrentSkipListSet (хэш-таблица в основе реализации)
🔘 Неблокирующие очереди ConcurrentLinkedQueue и ConcurrentLinkedDeque
🔘 Большой набор различных блокирующих очередей
Java Guru 🤓
30 апреля 2024 г. 12:01
Как наладить взаимодействие Kafka и Clickhouse?

Apache Kafka и ClickHouse — два популярных инструмента обработки и анализа данных, которые так нужны дата-инженерам и разработчикам.

👉 На открытом практическом урокеоткрытом практическом уроке от OTUS опытный эксперт расскажет, как превратить две этих технологии в эффективный тандем!

— Рассмотрим Apache Kafka. Познакомимся с ClickHouse.
— Узнаем, как организовать загрузку данных из Kafka в ClickHouse.
— Ответим на все возникающие вопросы.

Встречаемся 8 мая в 20:00 мск в преддверии старта курса «Apache Kafka».
⚡️ Регистрируйтесь прямо сейчас, чтобы не пропустить бесплатный урок: https://vk.cc/cwuAT6https://vk.cc/cwuAT6

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruwww.otus.ru
Java Guru 🤓
30 апреля 2024 г. 9:49
Что делает volatile?

volatile
volatile – ключевое слово для работы с многопоточностью. Не то же самое, что volatile в C++, не обязано делать что-либо с кэшем процессора. Оказывает на поле объекта ровно два эффекта.

Во-первых, чтение/запись такого поля становятся атомарными. Это применение актуально только для long и double, и не на всех платформах. Для остальных типов полей это верно и так.

Второй и самый интересный эффект – пара событий запись-чтение для такого поля являются synchronization actions. Значит, между ними существует отношение happens-before. Это значит, что существует гарантия, что произошедшее в памяти до записи будет видно после чтения. То есть будут успешно прочитаны значения, записанные в другие переменные.

Для полного понимания темы рекомендуется к просмотру доклад
Алексея Шипилёва и документация. Лучше всего эффект volatile иллюстрирует задача из этого доклада, которую часто и дают в качестве этого вопроса. Вопрос – что выведет данный код:

int a; int b;

// thread 1:
a = 1;
b = 2;

// thread 2:
System.out.print(b);
System.out.print(a);

Трюк в том, что помимо очевидных 21 (поток 2 отработал после 1), 00 (поток 2 отработал до 1, переменные еще не инициализированы) и 01 (поток 2 сработал между записями), может быть и неожиданные 20. Дело в том, что для операторов одного потока действует program order, он гарантирует хотя бы видимость правильной последовательности операций. Между потоками необходим «мост» из happens-before. Его даст применение модификатора volatile к переменной b, неожиданный результат 20 будет исключен.

Этот эффект используется для получения простой и дешевой адаптации программы к многопоточной среде без использования сложных и ошибкоопасных техник блокировок и синхронизаций.
Java Guru 🤓
28 апреля 2024 г. 14:00
В мае стартует новая программа «Java разработчик. Уровень Специалист».

Обучение проходит в мини-группе с преподавателем и живой практикой. Часть материалов — для самообучения.

Программа включает в себя:
📌 Применение ООП и функциональной парадигмы,
📌 Spring Framework, 
📌 работу с БД, 
📌 архитектуру REST, 
📌 вспомогательные инструменты Java-разработчика,
📌 продвинутые аспекты применения Java, 
📌 стандартную библиотеку Java II.

👉 Узнать подробнее 👈

Бонусы:
✔️ всем, кто запишется на программу до 17 мая, предоставляем бесплатный доступ к первым 5 урокам на 3 дня
✔️ подготовка к сдаче Java-сертификации и скидка 50% на ее прохождение
✔️ бесплатный курс «Разработка на Java и Spring с помощью Chat GPT: от составления ТЗ до модульного тестирования»

Реклама. АНО ДПО "УЦ ИБС". ИНН 7713388004. erid: LjN8K6Ntz
Java Guru 🤓
28 апреля 2024 г. 8:58
Что такое synchronized?

Можно применять как модификатор метода, и как самостоятельный оператор с блоком кода. Выполняет код при захваченном мониторе объекта. В виде оператора объект указывается явно. В виде модификатора нестатического метода используется this, статического – .class текущего класса.

Один из основных инструментов обеспечения потокобезопасности. Одновременно выполняется не более одного блока synchronized на одном и том же объекте. Такая блокировка называется intrinsic lock или monitor lock, подробно рассматривается в Java Concurrency in Practice 2.3.1.

Блок synchronized также необходим для использования методов wait, notify, notifyAll.
Java Guru 🤓
26 апреля 2024 г. 13:01
Сертификат по кибербезопасности на новом курсе для старших разработчиков Java

🚀 12 мая мы запускаем юбилейный поток курса Senior Java Developer с новой программой.

Что изменилось? Мы усилили курс новым модулем по кибербезопасности.

❓Зачем Java-разработчику разбираться в кибербезопасности? Логичный вопрос. И вот что мы ответим: наши партнеры провели опрос: на что бизнес обращает внимание при выборе платформы корпоративного банкинга. 100% ответов — защищенный доступ к финансам в личном кабинете с использованием двухфакторной аутентификации. Умеешь защищать данные при разработке — продукт еще больше ценят на рынке. Все просто!

✅ Итак, что тебя ждет на курсе:
- Развертывание приложений с помощью DevSecOps
- Моделирование схемы контроля доступа для систем и приложений
- Углубленное изучение Java Concurrency и Spring
- Архитектура — паттерны проектирования, Docker, Kubernetes
- Двойная сертификация по Java и кибербезопасности

💥И это лишь часть программы нового курса. Специально для тебя открыли 5 мест с индивидуальным менторским сопровождением. После прохождения шести образовательных модулей мы поможем тебе с трудоустройством у наших партнеров: Сбера, СДЭК и ЦБ.

➡️ Почитать подробности и оставить заявку можно здесь: https://clck.ru/3AJExxhttps://clck.ru/3AJExxhttps://clck.ru/3AJExx

Реклама. ООО "Платформа непрерывного обучения" ИНН 7839405924
erid: 2VtzqvhKyV2
Java Guru 🤓
26 апреля 2024 г. 8:46
Как прочитать InputStream в строку?

Обычно строковые данные извне попадают в программу именно в виде потока. Потоком читаются файлы, сетевые данные из сокета, пользовательский ввод. Если есть такая возможность, лучше избегать сохранения потоковых данных в память, и обрабатывать их также в потоке. Например, когда из большого xml-файла необходимо достать один определенный элемент, имеет смысл выбрать потоковый xml-парсер.

В общем виде все решения выглядят так. Заводится буфер – массив символов. Поток направляется в этот буфер. По заполнению данные из массива присоединяются в хвост строки-результата.

Простой способ – использовать трюк со сканером. Вообще класс Scanner читает из потока подстроки, разделенные указанным символом. Когда нужно прочитать всю строку сразу, в качестве разделителя устанавливается "\\A" – спецсимвол «начало строки». Это решение просто в реализации, но имеет проблемы. Размер внутреннего буфера фиксирован (1024 символа), а логика поиска разделителя плохо влияет на производительность.

Хорошее решение для продакшна – читать в собственный массив-буфер непосредственно методом
InputStream.readInputStream.read, либо обернув поток в InputStreamReader. Данные из буфера затем переправляются в строку через StringBuilder или ByteArrayOutputStream. За готовой реализацией можно обратиться в библиотеки Apache Commons IO и Google Guava. Полный код реализации и сравнение производительности описаны на stackoverflow.

На интервью этот вопрос часто возникает как часть практической задачи, для консольного ввода-вывода. Поэтому, если вы идете на собеседование со своим компьютером, и неуверенно владеете классами работы с потоками, стоит заранее подготовить шпаргалку с кодом.
Java Guru 🤓
25 апреля 2024 г. 13:45
👩‍💻👩‍💻Как писать более чистый код на Java с помощью перегрузки методов?

Перегрузка — очень мощная техника для случаев, когда нужно одинаковое имя метода с разными параметрами. Вместо того, чтобы дублировать имя метода и добавлять беспорядок в ваш код, вы можете просто перегрузить его. Это позволяет сохранять код чистым, а также снижает риск того, что дублирующие методы сломают часть системы.

Как это провернуть? Расскажет опытный эксперт на открытом практическом уроке от OTUS! Встречаемся 26 апреля в 20:00 мск в преддверии старта курса «Углубленное изучение языка Java».
Все участники вебинара получат специальную цену на обучение и персональную консультацию от менеджеров OTUS!

➡️ Регистрируйтесь прямо сейчас, чтобы не пропустить бесплатный урок: https://vk.cc/cwpp82

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Java Guru 🤓
25 апреля 2024 г. 7:58
Как разбить строку на слова?

StringTokenizer – специально предназначенный для этого класс стандартной библиотеки Java. Ему нужно задать разделители, по ним строка будет разделена на «токены». Это устаревший класс, он остается в библиотеке только для обратной совместимости.

Вместо него рекомендуется использовать метод String.split(). Метод принимает строку с регулярным выражением, и опциональный лимит токенов. Реализация особенно оптимизирована для односимвольного разделителя. Но следует помнить, что даже если символ один, это всё ещё регулярное выражение – спецсимвол должен экранироваться.

Другой подходящий метод – Pattern.split(). Он, наоборот, вызывается у регулярного выражения, а принимает целевую строку. В этот же метод делегируется и выполнение String.split(). Этот способ предпочтительнее, когда в регулярном выражении больше одного символа, а скомпилированный паттерн применяется повторно.