Библиотека джависта | Java, Spring, Maven, Hibernate
24.9K subscribers
1.86K photos
38 videos
42 files
2.64K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://yangx.top/proglibrary/9197

Обратная связь: @proglibrary_feedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
加入频道
☕️ Java IO (input-output) является потокоориентированным, а Java NIO (new/non-blocking io) – буфер-ориентированным. Потокоориентированный ввод/вывод подразумевает чтение/запись из потока/в поток одного или нескольких байт в единицу времени поочередно. Данная информация нигде не кэшируются. Таким образом, невозможно произвольно двигаться по потоку данных вперед или назад. В Java NIO данные сначала считываются в буфер, что дает больше гибкости при обработке данных.
☕️ Потоки ввода/вывода в Java IO являются блокирующими. Это значит, что когда в потоке выполнения вызывается read() или write() метод любого класса из пакета java.io.*, происходит блокировка до тех пор, пока данные не будут считаны или записаны. Поток выполнения в данный момент не может делать ничего другого. Неблокирующий режим Java NIO позволяет запрашивать считанные данные из канала (channel) и получать только то, что доступно на данный момент, или вообще ничего, если доступных данных пока нет. Вместо того, чтобы оставаться заблокированным пока данные не станут доступными для считывания, поток выполнения может заняться чем-то другим. Тоже самое справедливо и для неблокирующего вывода. Поток выполнения может запросить запись в канал некоторых данных, но не дожидаться при этом пока они не будут полностью записаны.
☕️ В Java NIO имеются селекторы, которые позволяют одному потоку выполнения мониторить несколько каналов ввода. Т.е. существует возможность зарегистрировать несколько каналов с селектором, а потом использовать один поток выполнения для обслуживания каналов, имеющих доступные для обработки данные, или для выбора каналов, готовых для записи.
#вопросы_с_собеседований
В каком случае требуется переопределять метод service()?
Метод service() переопределяется, когда необходимо, чтобы сервлет обрабатывал все запросы (и GET, и POST) в одном методе.

Когда контейнер сервлетов получает запрос клиента, то происходит вызов метода service(), который в зависимости от поступившего запроса вызывает или метод doGet() или метод doPost().
This media is not supported in your browser
VIEW IN TELEGRAM
Продолжаем следить за конкурсами с денежными призами. «Цифровой прорыв» совместно с Mail.Ru Group запускают IT-чемпионат по ML, AI и Data Science. Есть три задачи:

- Модель прогноза средних цен и объемов потребления товаров (ФНС России и Росстат)
- ИИ для поиска самолетов на снимках местности при проведении поисково-спасательных операций (Росавиация)
- ИИ для распознавания категории предмета музейного фонда (Минкультуры России)

Как видите, задачи практичные и важные, на решение дается целый месяц — с 14 июля по 14 августа. В каждой из трех задач есть 25 призовых мест, за первое место дают 100 тыс. ₽. Регистрация и подробности здесь: https://proglib.io/w/24a90147
🛠 Почему Java используется для разработки мобильных приложений?

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

https://proglib.io/sh/y7Jmec9Gnj
Что делает 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 будет исключен.

Этот эффект используется для получения простой и дешевой адаптации программы к многопоточной среде без использования сложных и ошибкоопасных техник блокировок и синхронизаций.
Какими значениями инициализируются переменные по умолчанию?
• Числа инициализируются 0 или 0.0;
• char — \u0000;
• boolean — false;
• Объекты (в том числе String) — null.
⚖️ Что такое лицензирование ПО и как оно работает?

Рассказываем о классификации лицензий и даем практические советы по лицензированию программного обеспечения.

https://proglib.io/sh/6KQ4TnvaNb
JavaServer Pages Standard Tag Library, JSTL, Стандартная библиотека тегов JSP — расширение спецификации JSP (конечный результат JSR 52), добавляющее библиотеку JSP тегов для общих нужд, таких как разбор XML данных, условная обработка, создание циклов и поддержка интернационализации.

JSTL является альтернативой такому виду встроенной в JSP логики, как скриплеты (прямые вставки Java кода). Использование стандартизованного множества тегов предпочтительнее, поскольку получаемый код легче поддерживать и проще отделять бизнес-логику от логики отображения.
Что такое «fail-fast поведение»?

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

В Java Collections API некоторые итераторы ведут себя как fail-fast и выбрасывают ConcurrentModificationException, если после его создания была произведена модификация коллекции, т.е. добавлен или удален элемент напрямую из коллекции, а не используя методы итератора.

Реализация такого поведения осуществляется за счет подсчета количества модификаций коллекции (modification count):

• при изменении коллекции счетчик модификаций так же изменяется;
• при создании итератора ему передается текущее значение счетчика;
• при каждом обращении к итератору сохраненное значение счетчика сравнивается с текущим, и, если они не совпадают, возникает исключение.
Почитать Telegram по пути на работу или полистать избранные каналы в обеденный перерыв — привычка полезная. Она работает еще лучше, если периодически пополнять свой список чем-то новеньким.

Вот, например, ребята из Accenture Russia запустили свой канал для IT-сообщества. У них там и полезная информация на разные темы (работа с данными, облака, микросервисы, AI, DevOps, backend- и frontend-разработка, управление проектами и т.д.), и анонсы мероприятий, и розыгрыши призов в духе книжки на профтему, билета на классную конфу и не только.

Подписывайся, читай, выигрывай!
#вопросы_с_собеседований
Сколько элементов будет пропущено, если Iterator.next() будет вызван после 10-ти вызовов Iterator.hasNext()?
Ответ

Нисколько - hasNext() осуществляет только проверку наличия следующего элемента.
В следующий понедельник стартует Курс по многопоточному программированию на Java.

Уровень: middle/senior

Подойдёт тем, кто знает основы многопоточки и готов выйти на новый уровень.

Курс строится вокруг java.util.concurrent. Изучим всё, что там есть, как это применять на практике и сравним разные инструменты между собой. Затронем и смежные темы: мониторинг, флажки JVM, виртуальные потоки и реактивное программирование.

Разберём огромное количество кейсов, лучших практик и возможных ошибок. Курс максимально ориентирован на практику и ситуацию в 2021 году.

Через два месяца вы получите всю базу для работы на хайлоад проекте. Сможете уверенно решать задачи под разную нагрузку. Будете круто выглядеть на собеседованиях🔥

Старт: 12 июля
Длительность: 8 недель

Программа, отзывы - здесь.

Записывайся ➡️ https://fillthegaps.ru/mt2
#вакансия #remote #java #backend #работа #москва

Компания: Bright group (bright-group.ru)
Формат работы: удалёнка
Зарплатная вилка: от 200 до 300k net

Middle/Senior java backend-разработчик в компанию Bright Group в наш IT-продукт по управлению движением транспорта и планированию его расписания в режиме реального времени.

Наш стек: Java, Postgres, Hibernate, Spring Framework 5, Spring Boot 2
Инфраструктра: JIRA, Confluence, Gitlab/Jenkins, Docker, Kubernetes (Openshift)

✔️Требования:
Опыт работы на Java от 3 лет;
Отличное знание алгоритмов, структур данных, способность писать эффективный код;
Опыт работы с микросервисной архитектурой;
Уверенное понимание архитектуры сетевых приложений;
Опыт разработки приложений, основанных на принципах ООП и паттерне MVC;
Умение самостоятельно принимать архитектурные решения, искать нужную информацию;
Уверенное знание SQL;
Использовать актуальные подходы к разработке и современные технологии;
Решать задачи в команде с системным аналитиком, frontend-разработчиками и QA-инженерами.
Опыт разработки клиент-серверных приложений (REST, JSON);
Опыт работы с Git, знание git flow;
Умение работать в команде;
Высшее техническое образование.

📌Задачи:
Участвовать в процессе разработки функционала, начиная с проектирования и заканчивая поставкой и поддержкой;
Исследовать и улучшать производительность приложений;
Писать тесты, инспектировать код;
Выстраивать взаимодействие внутри команды и снаружи (с project-менеджерами, тестировщиками, frontend-разработчиками);
Оценивать работу людей в команде, давать обратную связь. Развивать людей в команде;
Вести пул технических задач;
Умение общаться и доносить свои мысли лаконично, объяснять свою позицию.

🔅 Что мы предлагаем:
- Удаленный формат работы;
- Гибкий график;
- Официальное оформление, белая ЗП;
- ДМС.

🤳Контакты:
[email protected]
@avokonlehc

Всем отличного дня!
#вопросы_с_собеседований
На каком объекте происходит синхронизация при вызове static synchronized метода?
У синхронизированного статического метода нет доступа к this, но есть доступ к объекту класса Class, он присутствует в единственном экземпляре и именно он выступает в качестве монитора для синхронизации статических методов. Таким образом, следующая конструкция:

public class SomeClass {

public static synchronized void someMethod() {
//code
}
}

эквивалентна такой:

public class SomeClass {

public static void someMethod(){
synchronized(SomeClass.class){
//code
}
}
}