Как использовать ReadWriteLock?
Стандартный интерфейс
Оба типа блокировок одного экземпляра
Свойства этих локов защищают программу от ситуаций конкурентной записи ресурса и чтения во время записи. Подобно copy-on-write коллекциям, этот подход становится выгодным, когда ресурс читают сильно чаще чем модифицируют.
Интерфейс реализуется классом
👉@BookJava
Стандартный интерфейс
ReadWriteLock
предоставляет потокобезопасный разделенный доступ на чтение и на запись. Для этих целей в нём объявлены два метода: readLock()
и writeLock()
. Они возвращают объекты под интерфейсом Lock.Оба типа блокировок одного экземпляра
ReadWriteLock
связаны. Пока какой-то поток не заберет блокировку на запись, сколько угодно потоков могут читать не мешая друг другу. Блокировкой readLock
закрывается часть кода с семантикой «только чтения» некоторого условного «ресурса». В критической секции кода writeLock
осуществляется модификация ресурса.Свойства этих локов защищают программу от ситуаций конкурентной записи ресурса и чтения во время записи. Подобно copy-on-write коллекциям, этот подход становится выгодным, когда ресурс читают сильно чаще чем модифицируют.
Интерфейс реализуется классом
ReentrantReadWriteLock
, который во многом похож на обычный ReentrantLock.👉@BookJava
👍3👏2
Исходные файлы статьи о быстром нахождении чисел Фибоначчи.
https://github.com/nebel-abyssus/fibonacci
👉@BookJava
https://github.com/nebel-abyssus/fibonacci
👉@BookJava
GitHub
GitHub - nebel-abyssus/fibonacci: Исходные файлы статьи о быстром нахождении чисел Фибоначчи.
Исходные файлы статьи о быстром нахождении чисел Фибоначчи. - nebel-abyssus/fibonacci
👍3
Что такое classpath?
Classpath – это параметр, который указывает приложениям где искать пользовательские классы. По этому адресу должны быть найдены все классы, для которых не применяются специальные загрузчики. На место поиска стандартных классов JRE этот параметр не влияет.
Кроме непосредственно Java-приложений (команда
Есть два основных способа установки classpath: в переменной окружения ОС
В параметре передаются пути к jar-файлам и корневым директориям с пакетами. Пути разделяют символом
Если приложение запускается из jar-файла (
👉@BookJava
Classpath – это параметр, который указывает приложениям где искать пользовательские классы. По этому адресу должны быть найдены все классы, для которых не применяются специальные загрузчики. На место поиска стандартных классов JRE этот параметр не влияет.
Кроме непосредственно Java-приложений (команда
java
), этот параметр применим и для других утилит JDK, таких как javac
, javadoc
и другие.Есть два основных способа установки classpath: в переменной окружения ОС
CLASSPATH
, и в аргументе командной строки -cp
(синоним -classpath
). Второй способ предпочтительнее, потому что позволяет устанавливать разные значения для разных приложений. Значение по умолчанию – текущая директория.В параметре передаются пути к jar-файлам и корневым директориям с пакетами. Пути разделяют символом
:
в параметре командной строки, или же ;
в переменной окружения. Чтобы включить все файлы директории, разрешается использовать в конце пути символ *
.Если приложение запускается из jar-файла (
java -jar
), classpath должен быть указан в его манифесте.👉@BookJava
👍6
Подборка Telegram каналов для программистов
Системное администрирование 📌
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT.
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Чат программистов📌
https://t.me/developers_ru
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Excel лайфхак📌
https://t.me/Excel_lifehack
Системное администрирование 📌
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT.
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Чат программистов📌
https://t.me/developers_ru
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Excel лайфхак📌
https://t.me/Excel_lifehack
🔥3👍1
Совет по Spring 💡
Протоколирование HTTP-запросов с помощью фильтра
Включите протоколирование запросов с помощью фильтра
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/filter/CommonsRequestLoggingFilter.html
👉@BookJava
Протоколирование HTTP-запросов с помощью фильтра
CommonsRequestLoggingFilter
Включите протоколирование запросов с помощью фильтра
CommonsRequestLoggingFilter
, чтобы получать подробную информацию о входящих запросах. 🔥https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/filter/CommonsRequestLoggingFilter.html
👉@BookJava
docs.spring.io
CommonsRequestLoggingFilter (Spring Framework 6.2.3 API)
declaration: package: org.springframework.web.filter, class: CommonsRequestLoggingFilter
👍4
Совет по Spring 💡
Вы можете преобразовать
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/format/annotation/DateTimeFormat.html
👉@BookJava
Вы можете преобразовать
String RequestParams
непосредственно в LocalDate
на уровне запроса с помощью @DateTimeFormat
. Вам необходимо указать шаблон. Это может быть ваш собственный шаблон или шаблон ISO. Нет необходимости преобразовывать его «вручную».https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/format/annotation/DateTimeFormat.html
👉@BookJava
🔥10👍6
Совет по Spring Boot 💡
Начиная с Spring Boot 3.1🍃, вы можете автоматически запускать внешние сервисы (например, базы данных) в режиме dev, используя Testcontainers и новую `
👉@BookJava
Начиная с Spring Boot 3.1🍃, вы можете автоматически запускать внешние сервисы (например, базы данных) в режиме dev, используя Testcontainers и новую `
spring-boot:test-run
`. Вот инструкция 👆👉@BookJava
🔥13👍2❤1
Совет по Spring Boot 💡
Аннотация с возможностью кэширования
Обеспечьте быстрый доступ к данным и уменьшите нагрузку на базу данных. 🔥
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/cache/annotation/Cacheable.html
👉@BookJava
Аннотация с возможностью кэширования
Обеспечьте быстрый доступ к данным и уменьшите нагрузку на базу данных. 🔥
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/cache/annotation/Cacheable.html
👉@BookJava
👍8😁2
Совет по Spring Boot 💡
Вы думаете о замене 🍃`RestTemplate` на новый Spring
👉@BookJava
Вы думаете о замене 🍃`RestTemplate` на новый Spring
RestClient
? Конфигурация SSL очень проста благодаря поддержке 🔐`SslBundles` через интерфейс RestClientSsl
👆👉@BookJava
🔥5👍3
Совет по Spring Boot 💡
Если вы используете DTO в Spring Data/JPA, вы можете автоматизировать отображение между сущностями и DTO с помощью библиотеки Blaze Persistence (https://persistence.blazebit.com). Тогда вы сможете воспользоваться преимуществами, например, паттерна Spring repository.
👉@BookJava
Если вы используете DTO в Spring Data/JPA, вы можете автоматизировать отображение между сущностями и DTO с помощью библиотеки Blaze Persistence (https://persistence.blazebit.com). Тогда вы сможете воспользоваться преимуществами, например, паттерна Spring repository.
👉@BookJava
👏12
Совет по Spring Boot 🍃💡
Если вы перешли на Java 21 и используете Spring Boot 3.1 или ниже, вам необходимо обновить билдер Paketo, чтобы избежать ошибки: «Builder lifecycle „creator“ failed with status code 51» во время `
👉@BookJava
Если вы перешли на Java 21 и используете Spring Boot 3.1 или ниже, вам необходимо обновить билдер Paketo, чтобы избежать ошибки: «Builder lifecycle „creator“ failed with status code 51» во время `
mvn spring-boot:build-image
`.👉@BookJava
👍7😁3🥰1
Совет по Spring Boot 🍃💡
Если вы используете Docker Compose или Testcontainers и хотите узнать
👉@BookJava
Если вы используете Docker Compose или Testcontainers и хотите узнать
ConnectionDetails
, которые мы используем под капотом, просто выведите их 🤩 👉@BookJava
👍4🤡2🥰1
Совет по Spring Boot💡
Используйте
https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/builder/SpringApplicationBuilder.html
👉@BookJava
Используйте
SpringApplicationBuilder
для настройки запуска, свойств и профилей приложения.https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/builder/SpringApplicationBuilder.html
👉@BookJava
docs.spring.io
SpringApplicationBuilder (Spring Boot 3.2.5 API)
declaration: package: org.springframework.boot.builder, class: SpringApplicationBuilder
👍4
🚀Совет по использованию Spring Boot API🚀
Мастер настройки приложений Spring Boot. Настройте поведение вашего приложения при запуске.
https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/builder/SpringApplicationBuilder.html
👉@BookJava
SpringApplicationBuilder
Мастер настройки приложений Spring Boot. Настройте поведение вашего приложения при запуске.
https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/builder/SpringApplicationBuilder.html
👉@BookJava
docs.spring.io
SpringApplicationBuilder (Spring Boot 3.2.5 API)
declaration: package: org.springframework.boot.builder, class: SpringApplicationBuilder
👍2
Что можно импортировать статически?
Обычный импорт избавляет от необходимости писать полное имя классов: при использовании можно не указывать пакет. Статические импорты делает то же самое, но для статических членов класса.
Самое распространенное применение статического импорта – включение констант из константных интерфейсов и статических методов из утилитарных классов. Но также можно включать и изменяемые статические поля других классов.
Отдельно интересен случай nested-класса. Он одновременно является и классом, и статическим членом другого класса. Поэтому для него работает как обычный, так и статический импорт.
Языковая конструкция
👉@BookJava
Обычный импорт избавляет от необходимости писать полное имя классов: при использовании можно не указывать пакет. Статические импорты делает то же самое, но для статических членов класса.
Самое распространенное применение статического импорта – включение констант из константных интерфейсов и статических методов из утилитарных классов. Но также можно включать и изменяемые статические поля других классов.
Отдельно интересен случай nested-класса. Он одновременно является и классом, и статическим членом другого класса. Поэтому для него работает как обычный, так и статический импорт.
Языковая конструкция
static import
обязана располагаться там же, где и обычные импорты – обязательно между package и объявлением основного класса файла.👉@BookJava
👍1
new Integer(128) == 128?
Для всех классов-оберток над примитивами кроме Float и Double работает механизм кэширования. Некоторые значения создаются на этапе инициализации класса, и переиспользуются когда объект создается не оператором new (например с помощью valueOf).
Кэшируемые значения – оба возможных Boolean, Character до '\u007f' (127) и все целые числа от -128 до 127 включительно. С Java 7 верхнюю границу для Integer можно увеличить параметром java.lang.Integer.IntegerCache.high.
Значения кэшируются и во многих других встроенных классах: BigDecimal, Currency, пустые коллекции. Детали можно узнавать из исходников и документаций, так как эти кэши реализованы не на уровне JVM а в коде классов.
В конкретно этом примере скрыт еще один подвох: объект класса-обертки сравнивается с примитивом. Это приводит к анбоксингу и сравнению значений. И ответ на вопрос – да.
👉@BookJava
Для всех классов-оберток над примитивами кроме Float и Double работает механизм кэширования. Некоторые значения создаются на этапе инициализации класса, и переиспользуются когда объект создается не оператором new (например с помощью valueOf).
Кэшируемые значения – оба возможных Boolean, Character до '\u007f' (127) и все целые числа от -128 до 127 включительно. С Java 7 верхнюю границу для Integer можно увеличить параметром java.lang.Integer.IntegerCache.high.
Значения кэшируются и во многих других встроенных классах: BigDecimal, Currency, пустые коллекции. Детали можно узнавать из исходников и документаций, так как эти кэши реализованы не на уровне JVM а в коде классов.
В конкретно этом примере скрыт еще один подвох: объект класса-обертки сравнивается с примитивом. Это приводит к анбоксингу и сравнению значений. И ответ на вопрос – да.
👉@BookJava
👍7
Как инициализировать переменную функционального интерфейса?
Функциональный интерфейс – всё ещё интерфейс, поэтому остаются доступными стандартные способы. Интерфейс можно реализовать обычным классом, и затем создать его экземпляр оператором new. Можно совместить эти два действия, и создать экземпляр анонимного класса.
Основное преимущество, которое дает функциональный интерфейс – два дополнительных способа инициализации параметров и переменных.
1. Лямбда-выражение:
2. Ссылка на метод:
На эти способы накладывается небольшое ограничение: тип функционального параметра/переменной должен быть указан явно. Это значит, что лямбдой или метод-референсом нельзя инициализировать переменную, объявленную ключевым словом var. Также, чтобы передать лямбду или референс в параметр generic-типа, этот тип должен быть ограничен функциональным интерфейсом (должен стираться в него).
👉@BookJava
Функциональный интерфейс – всё ещё интерфейс, поэтому остаются доступными стандартные способы. Интерфейс можно реализовать обычным классом, и затем создать его экземпляр оператором new. Можно совместить эти два действия, и создать экземпляр анонимного класса.
Основное преимущество, которое дает функциональный интерфейс – два дополнительных способа инициализации параметров и переменных.
1. Лямбда-выражение:
(x, y) -> x * y
2. Ссылка на метод:
Math::sqrt
На эти способы накладывается небольшое ограничение: тип функционального параметра/переменной должен быть указан явно. Это значит, что лямбдой или метод-референсом нельзя инициализировать переменную, объявленную ключевым словом var. Также, чтобы передать лямбду или референс в параметр generic-типа, этот тип должен быть ограничен функциональным интерфейсом (должен стираться в него).
👉@BookJava
👍4
Совет по Java 💡☕️
Чтобы получить все дни месяца, вы можете начать с объекта
👉@BookJava
Чтобы получить все дни месяца, вы можете начать с объекта
YearMonth
, получить его первый день, а затем использовать функцию datesUntil()
, которая возвращает Stream всех дней до указанной даты. 👉@BookJava
👍6
🚀 Spring Boot с DevTools для Live Reload🚀
Ускорьте разработку с помощью DevTools! 🔥
https://docs.spring.io/spring-boot/reference/using/devtools.html
👉@BookJava
Ускорьте разработку с помощью DevTools! 🔥
https://docs.spring.io/spring-boot/reference/using/devtools.html
👉@BookJava
🔥5👏3
Внутри JVM: Массивы и их отличие от других объектов
Массивы являются уникальными объектами в JVM, и понимание их структуры позволяет лучше писать код.
Самый простой способ классификации элементов данных Java - это разделение их на примитивы и объекты. К примитивам, как известно большинству разработчиков Java, относятся булевы числа, байты, символы, варианты целых чисел (short, int и long), а также варианты чисел с плавающей точкой (floats и doubles). Внутри JVM эти примитивы инстанцируются в "сыром" виде. Объявление int создает для JVM 32-разрядное знаковое целое поле, с которым она может работать. Чаще всего эти примитивы создаются в стеке операндов, который строится при каждом вызове метода. (Заметным исключением являются статические примитивы, которые создаются в куче).
https://blogs.oracle.com/javamagazine/post/java-array-objects
👉@BookJava
Массивы являются уникальными объектами в JVM, и понимание их структуры позволяет лучше писать код.
Самый простой способ классификации элементов данных Java - это разделение их на примитивы и объекты. К примитивам, как известно большинству разработчиков Java, относятся булевы числа, байты, символы, варианты целых чисел (short, int и long), а также варианты чисел с плавающей точкой (floats и doubles). Внутри JVM эти примитивы инстанцируются в "сыром" виде. Объявление int создает для JVM 32-разрядное знаковое целое поле, с которым она может работать. Чаще всего эти примитивы создаются в стеке операндов, который строится при каждом вызове метода. (Заметным исключением являются статические примитивы, которые создаются в куче).
https://blogs.oracle.com/javamagazine/post/java-array-objects
👉@BookJava
❤4👍2