50+ задач по структуре данных и алгоритмам
https://dev.to/javinpaul/50-data-structure-and-algorithms-problems-from-coding-interviews-4lh2
#java #programming
https://dev.to/javinpaul/50-data-structure-and-algorithms-problems-from-coding-interviews-4lh2
#java #programming
👍5
Как устроены атомики?
Начнем с того, что такое атомики и зачем нужны.
Условно можно разделить подходы реализации большинства atomic-методов на две группы: compare-and-set и set-and-get.
Методы категории compare-and-set принимают старое значение и новое. Если переданное старое значение совпало с текущим, устанавливается новое. Обычно делегируют вызов в методы класса
В случае set-and-get старое значение неизвестно. Поэтому нужен небольшой трюк: программа сначала считывает текущее значение, а затем записывает новое, тоже с помощью CAS, потому что запись могла успеть поменяться даже за этот шаг. Эта попытка чтения+записи повторяется в цикле, пока старое значение не совпадет и переменная не будет успешно записана.
Этот трюк называется double-checked или optimistic locking, и может быть использован и в пользовательском коде с любым способом синхронизации. Оптимистичность заключается в том, что мы надеемся что состояния гонки нет, прибегая к синхронизации только если гонка всё же случилась. Реализация оптимистичной блокировки может быть дана как отдельная задача.
#Многопоточность
Начнем с того, что такое атомики и зачем нужны.
Atomic*
– семейство классов из java.util.concurrent
. Они предоставляют набор атомарных операций для соответствующих типов. Например с помощью методов getAndIncrement
/incrementAndGet
класса AtomicInteger
можно делать неатомарный в обычных условиях инкремент (i++
).Условно можно разделить подходы реализации большинства atomic-методов на две группы: compare-and-set и set-and-get.
Методы категории compare-and-set принимают старое значение и новое. Если переданное старое значение совпало с текущим, устанавливается новое. Обычно делегируют вызов в методы класса
Unsafe
, которые заменяются нативными реализациями виртуальной машины. Виртуальная машина в большинстве случаев использует атомарную операцию процессора compare-and-swap (CAS). Поэтому атомики обычно более эффективны чем стандартная дорогостоящая блокировка.В случае set-and-get старое значение неизвестно. Поэтому нужен небольшой трюк: программа сначала считывает текущее значение, а затем записывает новое, тоже с помощью CAS, потому что запись могла успеть поменяться даже за этот шаг. Эта попытка чтения+записи повторяется в цикле, пока старое значение не совпадет и переменная не будет успешно записана.
Этот трюк называется double-checked или optimistic locking, и может быть использован и в пользовательском коде с любым способом синхронизации. Оптимистичность заключается в том, что мы надеемся что состояния гонки нет, прибегая к синхронизации только если гонка всё же случилась. Реализация оптимистичной блокировки может быть дана как отдельная задача.
#Многопоточность
👍6👏1
Подборка каналов для IT специалистов 🎯
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/React_lib Подборки по React js и все что с ним связано
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов 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
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
CodePen 📌
https://t.me/codepen_1 Сообщество пользователей CodePen
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
Разработка игр 📌
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/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/ux_web Статьи, книги для дизайнеров
https://t.me/arhitekturamira World Architecture
Системное администрирование 📌
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/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Арбитраж трафика 📌
https://t.me/partnerochkin CPA и арбитраж трафика
Крипта 📌
https://t.me/bitkoinoff Новости криптовалют
Метавселенная, GameFi, Crypto 📌
https://t.me/metaverse360
DeepFake 📌
https://t.me/deepfakenow Публикуем deepfake видео
Мир технологий 📌
https://t.me/mir_teh Видео из мира технологий
Excel лайфхак📌
https://t.me/Excel_lifehack
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/React_lib Подборки по React js и все что с ним связано
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов 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
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
CodePen 📌
https://t.me/codepen_1 Сообщество пользователей CodePen
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
Разработка игр 📌
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/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/ux_web Статьи, книги для дизайнеров
https://t.me/arhitekturamira World Architecture
Системное администрирование 📌
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/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Арбитраж трафика 📌
https://t.me/partnerochkin CPA и арбитраж трафика
Крипта 📌
https://t.me/bitkoinoff Новости криптовалют
Метавселенная, GameFi, Crypto 📌
https://t.me/metaverse360
DeepFake 📌
https://t.me/deepfakenow Публикуем deepfake видео
Мир технологий 📌
https://t.me/mir_teh Видео из мира технологий
Excel лайфхак📌
https://t.me/Excel_lifehack
👍3
Что если блок finally выбросит исключение?
Блок finally выполняется вне зависимости от того, было ли выброшено в его блоке
Вопрос подразумевает второй случай, когда исполнение попадает в
Такая маскировка исключения усложняет отладку, лучше избегать её. Например IntelliJ IDEA выводит соответствующее предупреждение на оператор
Все тонкости прохода исключения через try-catch-finally описаны в разделе 14.20.2 спецификации.
#Язык
Блок finally выполняется вне зависимости от того, было ли выброшено в его блоке
try
исключение, или нет. Когда исключение не случилось в try
, но случилось в finally
, нет ничего интересного. Это исключение как обычно пойдет вверх по стеку вызовов, пока не попадется в соответствующий ему catch
.Вопрос подразумевает второй случай, когда исполнение попадает в
finally
в момент выброса исключения из try
. Исключение из finally заменит собой исключение из try и пойдет вверх по стеку вместо него. Оригинальная проблема будет попросту забыта.Такая маскировка исключения усложняет отладку, лучше избегать её. Например IntelliJ IDEA выводит соответствующее предупреждение на оператор
throw
внутри finally
.Все тонкости прохода исключения через try-catch-finally описаны в разделе 14.20.2 спецификации.
#Язык
👍5
Think Java: How to Think Like a Computer Scientist
Автор: Allen B. Downey (2020)
Данная книга написана для людей с небольшим опытом или вообще без опыта программирования. Цель книги — не просто научить читателя программировать на Java, но и помочь начать мыслить как специалист в области информатики. Каждая краткая глава охватывает материал, предназначенный для изучения за одну неделю и включает в себя упражнения, которые помогут вам практиковаться.
Во время чтения книги вы:
✔️Начнете изучать сложные темы небольшими шагами с примерами;
✔️Поймёте, как правильно формулировать задачи, творчески думать о решениях и писать чистый читабельный код;
✔️Определите, какие методы разработки больше вам подходят и попрактикуетесь в отладке программ;
✔️Изучите связи между вводом и выводом, классами и методами, строками и массивами;
✔️Поработаете над упражнениями.
Скачать книгу
Автор: Allen B. Downey (2020)
Данная книга написана для людей с небольшим опытом или вообще без опыта программирования. Цель книги — не просто научить читателя программировать на Java, но и помочь начать мыслить как специалист в области информатики. Каждая краткая глава охватывает материал, предназначенный для изучения за одну неделю и включает в себя упражнения, которые помогут вам практиковаться.
Во время чтения книги вы:
✔️Начнете изучать сложные темы небольшими шагами с примерами;
✔️Поймёте, как правильно формулировать задачи, творчески думать о решениях и писать чистый читабельный код;
✔️Определите, какие методы разработки больше вам подходят и попрактикуетесь в отладке программ;
✔️Изучите связи между вводом и выводом, классами и методами, строками и массивами;
✔️Поработаете над упражнениями.
Скачать книгу
Telegram
Библиотека программиста (книги для разработчиков)
Think Java: How to Think Like a Computer Scientist
Автор: Allen B. Downey (2020)
Автор: Allen B. Downey (2020)
👍6
Хотите научиться понимать кино?
Все за 8 лекций вы сможете начать разбираться в фильмах, как профессионал🔥
Вы научитесь:
✔️ Видеть связь между цветом, звуком, ракурсом и задумкой режиссера
✔️Оценивать работу оператора, сценаристов и художников
✔️ Замечать в фильмах отсылки к другим произведениям искусства
Скорее забирайте курс по скидке для подписчиков канала 👉 http://film.oppopart.ru/
Все за 8 лекций вы сможете начать разбираться в фильмах, как профессионал🔥
Вы научитесь:
✔️ Видеть связь между цветом, звуком, ракурсом и задумкой режиссера
✔️Оценивать работу оператора, сценаристов и художников
✔️ Замечать в фильмах отсылки к другим произведениям искусства
Скорее забирайте курс по скидке для подписчиков канала 👉 http://film.oppopart.ru/
👎4👍1
Что произойдет при вызове
Если итератор указывает на последний элемент коллекции, то возникнет исключение
Iterator.next()
без предварительного вызова Iterator.hasNext()?Если итератор указывает на последний элемент коллекции, то возникнет исключение
NoSuchElementException
, иначе будет возвращен следующий элемент.Что такое и как создать daemon thread?
Демон в широком значении – фоновая программа. В Java потоки-демоны имеют схожий смысл: это потоки для фоновых действий по обслуживанию основных потоков. Потоки не-демоны называются пользовательскими (user thread).
Тред создается демоном, если его родитель демон. Свойство Java-треда
По сравнению с пользовательскими потоками демоны имеют меньший приоритет выполнения.
Когда все пользовательские треды завершились, JVM завершает работу. Демоны не выполняют самостоятельных задач, поэтому не препятствуют остановке, программа завершается не дожидаясь окончания их работы.
Daemon thread может быть полезен для таких действий, как инвалидация кэша, периодическая актуализация значений из внешних источников, освобождение неиспользуемых пользовательских ресурсов.
#Многопоточность
Демон в широком значении – фоновая программа. В Java потоки-демоны имеют схожий смысл: это потоки для фоновых действий по обслуживанию основных потоков. Потоки не-демоны называются пользовательскими (user thread).
Тред создается демоном, если его родитель демон. Свойство Java-треда
isDaemon
можно переключать в любой момент до старта потока.По сравнению с пользовательскими потоками демоны имеют меньший приоритет выполнения.
Когда все пользовательские треды завершились, JVM завершает работу. Демоны не выполняют самостоятельных задач, поэтому не препятствуют остановке, программа завершается не дожидаясь окончания их работы.
Daemon thread может быть полезен для таких действий, как инвалидация кэша, периодическая актуализация значений из внешних источников, освобождение неиспользуемых пользовательских ресурсов.
#Многопоточность
Wikipedia
Демон (программа)
компьютерная программа в системах класса UNIX
👍4
Думаете о большой пропускной способности? Встречайте виртуальные потоки
Цель этой статьи — изучить известные факты о грядущем расширении модели многопоточности Java.
Нет, не беспокойтесь, текущая модель многопоточности Java остается, но за кулисами что-то хорошее уже стучится в виртуальную дверь.
Да, мы говорим о JEP-425: Virtual Threads.
Original
Цель этой статьи — изучить известные факты о грядущем расширении модели многопоточности Java.
Нет, не беспокойтесь, текущая модель многопоточности Java остается, но за кулисами что-то хорошее уже стучится в виртуальную дверь.
Да, мы говорим о JEP-425: Virtual Threads.
Original
👍2
Есть базовые знания Java, но нет понимания, как их развить?
У студентов и начинающих Java-специалистов осталось три дня, чтобы воспользоваться шансом и попасть в одну из Летних школ от Академии Яндекса.
•Школа мобильной разработки подойдет тем, кто хочет использовать Java или Kotlin для создания мобильных приложений на Android.
•Школа бэкенд-разработки поможет как следует прокачаться и погрузиться в мир промышленного программирования.
За два месяца вы сможете прокачать свои навыки, пообщаться с топовыми экспертами и поработать вместе с ними на реальных проектах. Тех, кто хорошо себя проявит, пригласят стать стажером или сотрудником Яндекса.
Стартует обучение в Школах 20 июля. Лекции, практические занятия и хакатоны с экспертами Яндекса пройдут онлайн, а разрабатывать и защищать собственные проекты студенты будут в московском офисе компании. Проезд и проживание участникам из регионов оплачивается.
Для поступления нужно пройти отборочный тур. Срок подачи заявок – до 23 июня.
У студентов и начинающих Java-специалистов осталось три дня, чтобы воспользоваться шансом и попасть в одну из Летних школ от Академии Яндекса.
•Школа мобильной разработки подойдет тем, кто хочет использовать Java или Kotlin для создания мобильных приложений на Android.
•Школа бэкенд-разработки поможет как следует прокачаться и погрузиться в мир промышленного программирования.
За два месяца вы сможете прокачать свои навыки, пообщаться с топовыми экспертами и поработать вместе с ними на реальных проектах. Тех, кто хорошо себя проявит, пригласят стать стажером или сотрудником Яндекса.
Стартует обучение в Школах 20 июля. Лекции, практические занятия и хакатоны с экспертами Яндекса пройдут онлайн, а разрабатывать и защищать собственные проекты студенты будут в московском офисе компании. Проезд и проживание участникам из регионов оплачивается.
Для поступления нужно пройти отборочный тур. Срок подачи заявок – до 23 июня.
👍1
Перемещаем все специальные символы в конец строки
Специальный символ - это символ, который не является буквенным или числовым. Например, в строке "!@$%^&*" все символы являются специальными.
Идея состоит в том, чтобы перемещаться по входной строке и заполнять две другие строки: одну, содержащую обычные символы (a, A, 1 и т. д.), и другую строку, содержащую специальные символы (@, $ и т. д.).
@BookJava
Специальный символ - это символ, который не является буквенным или числовым. Например, в строке "!@$%^&*" все символы являются специальными.
Идея состоит в том, чтобы перемещаться по входной строке и заполнять две другие строки: одну, содержащую обычные символы (a, A, 1 и т. д.), и другую строку, содержащую специальные символы (@, $ и т. д.).
@BookJava
👍6
Зачем используются thread local переменные?
Класс
Отличие тред-локальной переменной от обычной в том, что
Проще говоря, объект класса
Первый, самый очевидный вариант использования – данные, относящиеся непосредственно к треду, определенный пользователем «контекст потока». На скриншоте ниже пример такого использования:
Другой случай, с которым локальная переменная потока может помочь – кэширование read-only данных в многопоточной среде без дорогостоящей синхронизации.
Помимо обычного
#Многопоточность
Класс
ThreadLocal
представляет хранилище тред-локальных переменных. По способу использования он похож на обычную обертку над значением, с методами get()
, set()
и remove()
для доступа к нему, и дополнительным фабричным методом ThreadLocal.withInitial()
, устанавливающим значение по-умолчанию.Отличие тред-локальной переменной от обычной в том, что
ThreadLocal
хранит отдельную независимую копию значения для каждого ее использующего потока. Работа с такой переменной потокобезопасна.Проще говоря, объект класса
ThreadLocal
хранит внутри не одно значение, а как бы хэш-таблицу поток➝значение, и при использовании обращается к значению для текущего потока.Первый, самый очевидный вариант использования – данные, относящиеся непосредственно к треду, определенный пользователем «контекст потока». На скриншоте ниже пример такого использования:
ThreadId.get()
вернет порядковый номер текущего треда.Другой случай, с которым локальная переменная потока может помочь – кэширование read-only данных в многопоточной среде без дорогостоящей синхронизации.
Помимо обычного
ThreadLocal
, в стандартной библиотеке присутствует его расширение InheritableThreadLocal
. Этот класс «наследует» значение – изначально берет его для потока, являющегося родителем текущего.#Многопоточность
👍2
Знакомимся с Javassist
В этой статье мы рассмотрим Javassist, как инструмент, с помощью которого мы будем вклиниваться в существующий байткод и трансформировать его.
@BookJava
В этой статье мы рассмотрим Javassist, как инструмент, с помощью которого мы будем вклиниваться в существующий байткод и трансформировать его.
@BookJava
Хабр
Знакомимся с Javassist
Часть первая Всем большой привет! Перед началом стоит сказать, что библиотека Javassist довольно мощный инструмент, так как стирает почти все границы у того безграничного языка JAVA, позволяя...
👍2
Внимание, планете угрожает опасность!
Создатель нашего мира написал код, на котором работает наша реальность, но допустил серьезные ошибки: все телефоны покинули планету, и люди остались без связи! Если это не исправить, случится конец света. Перед вами три задачи для программистов на разных языках, в том числе Java. Найдите все ошибки и просмотрите все варианты, как их исправить и спасти мир.
Создатель нашего мира написал код, на котором работает наша реальность, но допустил серьезные ошибки: все телефоны покинули планету, и люди остались без связи! Если это не исправить, случится конец света. Перед вами три задачи для программистов на разных языках, в том числе Java. Найдите все ошибки и просмотрите все варианты, как их исправить и спасти мир.
vc.ru
Чиним матрицу
Задачки из Небесной канцелярии
Как выполнить две задачи параллельно?
Простейший, путь – явно создать два объекта типа
Такое ручное создание тредов полезно в учебных целях, но считается плохой практикой в промышленном коде: само создание – дорогостоящая операция, а большое количество случайно созданных потоков может приводить к проблеме голодания (starvation) потоков.
В качестве продвинутой альтернативы используются пуллы потоков – реализации интерфейса
Кроме самого пулла, экземпляры
В ответ на передачу на исполнение
В Android для асинхронного выполнения используется похожая сущность – Looper.
#Многопоточность
Простейший, путь – явно создать два объекта типа
Thread
, передать им инстансы Runnable
, с нужными задачами в реализации их методов run
, и запустить вызвав thread.start()
. Если в основном потоке нужно дождаться завершения задач – после start()
вызывается метод thread.join()
. Исполнение зависнет на вызове этого метода до тех пор, пока тред не закончит свою задачу и не умрет. Вся работа задач с внешними данными должна быть синхронизирована.Такое ручное создание тредов полезно в учебных целях, но считается плохой практикой в промышленном коде: само создание – дорогостоящая операция, а большое количество случайно созданных потоков может приводить к проблеме голодания (starvation) потоков.
В качестве продвинутой альтернативы используются пуллы потоков – реализации интерфейса
ExecutorService
. Такие сервисы создаются статическими фабричными методами класса Executors
. Они умеют принимать задачи в виде Runnable
- или Callable
-объектов на заранее созданном наборе потоков (собственно, пулле).Кроме самого пулла, экземпляры
ExecutorService
содержат фабрику потоков («инструкцию» как создать тред при необходимости), и коллекцию-очередь задач на исполнение.В ответ на передачу на исполнение
Runnable
или Callable
, сервис возвращает связанный с ним объект типа Future
– хранилище, которое будет заполнено результатом выполнения задачи в будущем. Даже если никакого результата не ожидается, Future
поможет дождаться момента завершения обработки задачи.В Android для асинхронного выполнения используется похожая сущность – Looper.
#Многопоточность
Oracle
Starvation and Livelock (The Java™ Tutorials >
Essential Java Classes > Concurrency)
Essential Java Classes > Concurrency)
This Java tutorial describes exceptions, basic input/output, concurrency, regular expressions, and the platform environment
👍10
Подборка каналов для IT специалистов 🎯
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/React_lib Подборки по React js и все что с ним связано
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов 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
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
CodePen 📌
https://t.me/codepen_1 Сообщество пользователей CodePen
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
Разработка игр 📌
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/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/ux_web Статьи, книги для дизайнеров
https://t.me/arhitekturamira World Architecture
Системное администрирование 📌
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/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Арбитраж трафика 📌
https://t.me/partnerochkin CPA и арбитраж трафика
Крипта 📌
https://t.me/bitkoinoff Новости криптовалют
Метавселенная, GameFi, Crypto 📌
https://t.me/metaverse360
DeepFake 📌
https://t.me/deepfakenow Публикуем deepfake видео
Мир технологий 📌
https://t.me/mir_teh Видео из мира технологий
Excel лайфхак📌
https://t.me/Excel_lifehack
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/React_lib Подборки по React js и все что с ним связано
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов 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
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
CodePen 📌
https://t.me/codepen_1 Сообщество пользователей CodePen
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
Разработка игр 📌
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/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/ux_web Статьи, книги для дизайнеров
https://t.me/arhitekturamira World Architecture
Системное администрирование 📌
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/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Арбитраж трафика 📌
https://t.me/partnerochkin CPA и арбитраж трафика
Крипта 📌
https://t.me/bitkoinoff Новости криптовалют
Метавселенная, GameFi, Crypto 📌
https://t.me/metaverse360
DeepFake 📌
https://t.me/deepfakenow Публикуем deepfake видео
Мир технологий 📌
https://t.me/mir_teh Видео из мира технологий
Excel лайфхак📌
https://t.me/Excel_lifehack
👍6🔥1
Опишите особенности работы с Shutdown Hooks.
Shutdown Hook – это обработчик завершения работы JVM. Действия, которые необходимо выполнить при прекращении работы программы, описываются в реализации объекта типа
При использовании обработчика нужно учитывать ряд нюансов:
1. Нет гарантии, что он будет выполнен целиком, и выполнен вообще. Хуки вызываются при нормальном завершении программы – завершении всех пользовательских потоков или вызове
2. В хуке нельзя использовать System.exit(0). Завершить работу можно ненулевым кодом, или методом
3. Набор обработчиков задается до их старта. Когда процесс обработки начался, новый вызов
4. Нет гарантий о порядке выполнения. Если обработчиков несколько, они могут вызываться в случайном порядке, и даже параллельно, в соседних потоках. Об этом намекает и форма объявления обработчика – класс
Больше деталей об особенностях обработчиков смотрите в официальных вопросах и ответах о Shutdown Hooks API.
#JVM
Shutdown Hook – это обработчик завершения работы JVM. Действия, которые необходимо выполнить при прекращении работы программы, описываются в реализации объекта типа
Thread
, и передаются в Runtime.getRuntime().addShutdownHook()
.При использовании обработчика нужно учитывать ряд нюансов:
1. Нет гарантии, что он будет выполнен целиком, и выполнен вообще. Хуки вызываются при нормальном завершении программы – завершении всех пользовательских потоков или вызове
System.exit()
. Например вызов System.halt()
или получение от системы SIGKILL программа завершится незамедлительно. Это может случиться как до выполнения обработчиков, так и во время. Сигнал SIGTERM запустит обработчики, но ОС может не дождаться завершения и оборвать процесс.2. В хуке нельзя использовать System.exit(0). Завершить работу можно ненулевым кодом, или методом
System.halt()
. Возврат нулевого кода после старта хуков приведет к зависанию программы.3. Набор обработчиков задается до их старта. Когда процесс обработки начался, новый вызов
addShutdownHook()
вызовет исключение.4. Нет гарантий о порядке выполнения. Если обработчиков несколько, они могут вызываться в случайном порядке, и даже параллельно, в соседних потоках. Об этом намекает и форма объявления обработчика – класс
Thread
.Больше деталей об особенностях обработчиков смотрите в официальных вопросах и ответах о Shutdown Hooks API.
#JVM
Telegram
Библиотека Java разработчика
Что такое и как создать daemon thread?
Демон в широком значении – фоновая программа. В Java потоки-демоны имеют схожий смысл: это потоки для фоновых действий по обслуживанию основных потоков. Потоки не-демоны называются пользовательскими (user thread).
…
Демон в широком значении – фоновая программа. В Java потоки-демоны имеют схожий смысл: это потоки для фоновых действий по обслуживанию основных потоков. Потоки не-демоны называются пользовательскими (user thread).
…
👍3
Что происходит если не обработать исключение?
Если не было предпринято дополнительных действий, в этой ситуации нет никаких хитростей. Всё приложение, и даже метод
Для изменения логики обработки непойманных исключений в Java существует функциональный интерфейс
Обработчик упущенных исключений может быть установлен (в порядке возрастания приоритета):
• глобально на всё приложение, статическим методом
• для группы потоков, переопределением метода
• для отдельного потока, методом
Естественно, установка нестандартного обработчика не имеет обратной силы. Используя его, нужно убедиться, что он установлен достаточно рано, до выброса какого-либо исключения.
Хорошей практикой считается обрабатывать исключение настолько близко к месту его выброса, насколько возможно. Следовательно, использование глобальных обработчиков – самый плохой вариант.
Так же как в случае различных финализаций, несмотря на все её недостатки, глобальная обработка иногда лучше, чем ничего. Она может, например, дать последний шанс освободить внешние ресурсы, или уведомить о некорректной работе программы более эффективно, чем через логи.
Когда код с исключением выполняет ExecutorService, мы не имеем прямого доступа к объектам потока. Но в этом случае результатом выполнения будет объект типа
Если же пользовательский код не станет дожидаться результатов, исключение будет потеряно, не оставив даже стектрейса в потоке вывода. Для предотвращения такой ситуации стоит снабдить поток обработчиком сразу после создания, определив для сервиса собственную
Обычно, если фреймворк скрывает от пользователя детали работы с потоками, он также скрывает и детали работы с исключениями, оставляя свой специальный способ назначить обработчик. И этот специальный обработчик – более специфичный, а значит более правильный подход, чем стандартная глобальная обработка исключений Java. Так, например, в Spring MVC применяется аннотация @ExceptionHandler.
#JVM
#Многопоточность
Если не было предпринято дополнительных действий, в этой ситуации нет никаких хитростей. Всё приложение, и даже метод
main()
, выполняется в потоках. Поток, в котором было выброшено и не обработано исключение, остановится, и распечатает стектрейс в вывод System.err
. Если это был последний пользовательский поток, приложение начнет завершение работы.Для изменения логики обработки непойманных исключений в Java существует функциональный интерфейс
Thread.UncaughtExceptionHandler
.Обработчик упущенных исключений может быть установлен (в порядке возрастания приоритета):
• глобально на всё приложение, статическим методом
Thread.setDefaultUncaughtExceptionHandler()
;• для группы потоков, переопределением метода
uncaughtException()
в реализации объекта подкласса ThreadGroup
(т.к. ThreadGroup
сам является наследником UncaughtExceptionHandler
);• для отдельного потока, методом
setUncaughtExceptionHandler()
.Естественно, установка нестандартного обработчика не имеет обратной силы. Используя его, нужно убедиться, что он установлен достаточно рано, до выброса какого-либо исключения.
Хорошей практикой считается обрабатывать исключение настолько близко к месту его выброса, насколько возможно. Следовательно, использование глобальных обработчиков – самый плохой вариант.
Так же как в случае различных финализаций, несмотря на все её недостатки, глобальная обработка иногда лучше, чем ничего. Она может, например, дать последний шанс освободить внешние ресурсы, или уведомить о некорректной работе программы более эффективно, чем через логи.
Когда код с исключением выполняет ExecutorService, мы не имеем прямого доступа к объектам потока. Но в этом случае результатом выполнения будет объект типа
Future
. Такой отложенный объект при попытке прочитать значение перевыбросит полученное исключение, завернув его в ExecutionException
. Новое исключение-обертка уже пойдет по обычному пути обработки текущего потока. Исключение как бы перекочует из внутреннего потока пулла во внешний, который использует этот пулл.Если же пользовательский код не станет дожидаться результатов, исключение будет потеряно, не оставив даже стектрейса в потоке вывода. Для предотвращения такой ситуации стоит снабдить поток обработчиком сразу после создания, определив для сервиса собственную
ThreadFactory
. Обычно, если фреймворк скрывает от пользователя детали работы с потоками, он также скрывает и детали работы с исключениями, оставляя свой специальный способ назначить обработчик. И этот специальный обработчик – более специфичный, а значит более правильный подход, чем стандартная глобальная обработка исключений Java. Так, например, в Spring MVC применяется аннотация @ExceptionHandler.
#JVM
#Многопоточность
👍9
Команда IT’s Tinkoff проведет митап для Java-разработчиков в Санкт-Петербурге ☕️
Эксперты Тинькофф расскажут про Ahead-Of-Time компиляцию Java-приложений и объяснят, как собрать сервис на Spring c GraalVM. А еще поделятся кейсами о том, как в компании тестируют микросервисы и пишут unit integration-, contract-, load-тесты.
Митап состоится 7 июля в конференц-зале «Ясная Поляна». Начало в 19:00. Зарегистрироваться: https://l.tinkoff.ru/java_meetup_spb
Эксперты Тинькофф расскажут про Ahead-Of-Time компиляцию Java-приложений и объяснят, как собрать сервис на Spring c GraalVM. А еще поделятся кейсами о том, как в компании тестируют микросервисы и пишут unit integration-, contract-, load-тесты.
Митап состоится 7 июля в конференц-зале «Ясная Поляна». Начало в 19:00. Зарегистрироваться: https://l.tinkoff.ru/java_meetup_spb
👍1
Чем отличается блокирующее чтение от неблокирующего?
В контексте Java речь в этом вопросе идет о блокирующем/неблокирующем чтении из потоков данных.
Классы блокирующего чтения находятся в пакете
Чтение данных из сетевого подключения – другое дело. Обычно программа обрабатывает данные быстрее, чем работает сеть. Возникают паузы, в которые поток блокирующего чтения стоит в ожидании, не принося пользы. К тому же серверное приложение работает со многими параллельными подключениями.
Блокирующее чтение можно распараллеливать на потоки, читая в пулле. Но делать это нужно вручную, а количество одновременных подключений будет всё ещё ограничено количеством потоков-обработчиков, потоки буду всё ещё останавливаться без дела.
Для случаев, когда в вашем приложении ожидается большое количество подключений, был добавлен пакет стандартной библиотеки
IO использует потоки. данные приходят последовательно, и сами нигде не сохраняются. Если вы не обеспечили буферизацию вручную, нет возможности откатиться назад и прочитать уже пришедшие данные еще раз.
NIO сразу читает данные в буфер. Вы можете перемещаться по этому буферу перечитывая уже прочитанную ранее информацию. Плата за это – необходимость вручную следить, что буфер заполнен достаточным объемом данных для обработки, и что он не переполнился.
В этой статье приводится показательная аналогия. Блокирующее чтение – это телефонный разговор, неблокирующее – переписка в чате. Делая телефонный звонок, вы ждете пока собеседник ответит, можете «обрабатывать» только один звонок одновременно, получаете ответы сразу и не можете переслушать услышанный но забытый ответ. В мессенджере вы ведете несколько чатов одновременно, обращаетесь к истории переписки, но ответы на ваши сообщения приходят не всегда сразу, а порядок их получения неоднозначен.
Для более подробного изучения можно начать со статьи на хабре, в статье на dzone приведены примеры использования разных подходов на практике.
#Сеть
#Многопоточность
В контексте Java речь в этом вопросе идет о блокирующем/неблокирующем чтении из потоков данных.
Классы блокирующего чтения находятся в пакете
java.io
. Вы наверняка много раз сталкивались с ними, работая с файлами и консольным вводом-выводом (классы Reader
, IOException
, InputStream
). При блокирующем чтении тред останавливается, пока не получит из потока необходимые данные. Для этих самых распространенных случаев использование неблокирующего чтения не несет пользы, потому что сама запись пользователем консоли и жестким диском будет последовательной.Чтение данных из сетевого подключения – другое дело. Обычно программа обрабатывает данные быстрее, чем работает сеть. Возникают паузы, в которые поток блокирующего чтения стоит в ожидании, не принося пользы. К тому же серверное приложение работает со многими параллельными подключениями.
Блокирующее чтение можно распараллеливать на потоки, читая в пулле. Но делать это нужно вручную, а количество одновременных подключений будет всё ещё ограничено количеством потоков-обработчиков, потоки буду всё ещё останавливаться без дела.
Для случаев, когда в вашем приложении ожидается большое количество подключений, был добавлен пакет стандартной библиотеки
java.nio
. С помощью NIO один тред может обслуживать несколько сетевых соединений одновременно, и переключаться между ними не теряя времени на ожидание данных.IO использует потоки. данные приходят последовательно, и сами нигде не сохраняются. Если вы не обеспечили буферизацию вручную, нет возможности откатиться назад и прочитать уже пришедшие данные еще раз.
NIO сразу читает данные в буфер. Вы можете перемещаться по этому буферу перечитывая уже прочитанную ранее информацию. Плата за это – необходимость вручную следить, что буфер заполнен достаточным объемом данных для обработки, и что он не переполнился.
В этой статье приводится показательная аналогия. Блокирующее чтение – это телефонный разговор, неблокирующее – переписка в чате. Делая телефонный звонок, вы ждете пока собеседник ответит, можете «обрабатывать» только один звонок одновременно, получаете ответы сразу и не можете переслушать услышанный но забытый ответ. В мессенджере вы ведете несколько чатов одновременно, обращаетесь к истории переписки, но ответы на ваши сообщения приходят не всегда сразу, а порядок их получения неоднозначен.
Для более подробного изучения можно начать со статьи на хабре, в статье на dzone приведены примеры использования разных подходов на практике.
#Сеть
#Многопоточность
👍10