Подборка каналов для IT специалистов 🎯
Программирование 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
Программирование 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
👍1
Как в лямбде изменить внешнюю локальную переменную?
Это нельзя сделать в лоб. Такой код не скомпилируется, потому что захваченная локальная переменная обязана быть effectively final. Такое требование исходит из следующих причин.
Локальная переменная хранится на стеке, а значит время ее жизни в отличие от долгоживущих элементов хипа ограничено скоупом и текущим потоком. Но экземпляр лямбды, захвативший эту переменную, мог бы быть передан наружу и использован для доступа к этой переменной из другого потока и после выхода из метода.
Эта проблема решается тем, что в лямбду копируется значение локальной переменной. Такая копия живет независимо, возможно дольше оригинала. Но это решение приведет к сложному поведению из-за возможности работы с неактуальным значением – копия и оригинал станут двумя разными переменными. Поэтому значение должно быть вечно актуально – неизменяемо.
Поля экземпляра менять можно, потому что захваченной переменной в этом случае выступает effectively final значение
Если локальную переменную всё же хочется изменить, решение очевидно – поместить её в кучу. Для этого нужно использовать любого рода обертку: одноэлементный массив, объект-atomic, специально созданный класс с этой переменной как полем.
Хак с оберткой решает проблему времени жизни и даёт коду скомпилироваться, но возвращает проблему сложности поведения. Если среда многопоточная, то вероятно порядок операций с этой переменной придется синхронизировать вручную.
#Язык #Многопоточность
Это нельзя сделать в лоб. Такой код не скомпилируется, потому что захваченная локальная переменная обязана быть effectively final. Такое требование исходит из следующих причин.
Локальная переменная хранится на стеке, а значит время ее жизни в отличие от долгоживущих элементов хипа ограничено скоупом и текущим потоком. Но экземпляр лямбды, захвативший эту переменную, мог бы быть передан наружу и использован для доступа к этой переменной из другого потока и после выхода из метода.
Эта проблема решается тем, что в лямбду копируется значение локальной переменной. Такая копия живет независимо, возможно дольше оригинала. Но это решение приведет к сложному поведению из-за возможности работы с неактуальным значением – копия и оригинал станут двумя разными переменными. Поэтому значение должно быть вечно актуально – неизменяемо.
Поля экземпляра менять можно, потому что захваченной переменной в этом случае выступает effectively final значение
this
.Если локальную переменную всё же хочется изменить, решение очевидно – поместить её в кучу. Для этого нужно использовать любого рода обертку: одноэлементный массив, объект-atomic, специально созданный класс с этой переменной как полем.
Хак с оберткой решает проблему времени жизни и даёт коду скомпилироваться, но возвращает проблему сложности поведения. Если среда многопоточная, то вероятно порядок операций с этой переменной придется синхронизировать вручную.
#Язык #Многопоточность
👍6
Forwarded from Книги по Java | Books Java 📚
Spring в действии 6 изд
Крейг Уоллс (2022)
Фреймворк Spring Framework - необходимый инструмент для разработчиков приложений на Java. В книге описана последняя версия Spring 3, который несет в себе новые мощные особенности, такие как язык выражений SpEL, новые аннотации для работы с контейнером IоС и поддержка архитектуры REST. Крейг Уоллс обладает особым талантом придумывать весьма интересные примеры, сосредоточенные на особенностях и приемах использования Spring, которые действительно будут полезны читателям.
Издание предназначено как для начинающих пользователей фреймворка, так и для опытных пользователей Spring, желающих задействовать новые возможности версии 3.0.
Скачать
👉 @java_360
Крейг Уоллс (2022)
Фреймворк Spring Framework - необходимый инструмент для разработчиков приложений на Java. В книге описана последняя версия Spring 3, который несет в себе новые мощные особенности, такие как язык выражений SpEL, новые аннотации для работы с контейнером IоС и поддержка архитектуры REST. Крейг Уоллс обладает особым талантом придумывать весьма интересные примеры, сосредоточенные на особенностях и приемах использования Spring, которые действительно будут полезны читателям.
Издание предназначено как для начинающих пользователей фреймворка, так и для опытных пользователей Spring, желающих задействовать новые возможности версии 3.0.
Скачать
👉 @java_360
👍9😁3❤1
Как получить гарантированный дедлок?
Сначала поговорим о том, что это такое. Deadlock – это взаимная блокировка, ситуация, когда два или более потока «наступают друг-другу на хвост» – зависают в вечном ожидании ресурсов, захваченных друг другом.
Livelock – похожая проблема, с тем лишь отличием, что потоки не останавливаются, а вместо этого зацикливаются, выполняя одни и те же бесполезные действия, ходят по кругу.
Стандартный подход к обеспечению гарантии защиты от дедлока – установка строгого порядка взятия блокировок. Если для мониторов A и B соблюдается всеобщий порядок захвата AB (и соответственно отпускания BA), то ни с одним потоком не случится попасть на ожидание B, успешно при этом захватив A.
Из этого можно догадаться, простой способ гарантировать возможность дедлока – явно нарушить это условие.
Нарушение условия даст дедлок «скорее всего когда-нибудь». Чтобы получить его точно и с первого раза, нужно гарантировать, что оба потока окажутся на этапе между захватами одного и другого ресурса в одно время. Это можно сделать множеством способов, в примере ниже использован
Вопрос дедлоков – одна из краеугольных тем параллельных вычислений, уходящая далеко за рамки этого вопроса. Для дальнейшего изучения рекомендуются статьи на википедии про дедлоки, про задачу об обедающих философах как классическая иллюстрация проблемы, и глава 10.1 Java Concurrency in Practice.
#Многопоточность
Сначала поговорим о том, что это такое. Deadlock – это взаимная блокировка, ситуация, когда два или более потока «наступают друг-другу на хвост» – зависают в вечном ожидании ресурсов, захваченных друг другом.
Livelock – похожая проблема, с тем лишь отличием, что потоки не останавливаются, а вместо этого зацикливаются, выполняя одни и те же бесполезные действия, ходят по кругу.
Стандартный подход к обеспечению гарантии защиты от дедлока – установка строгого порядка взятия блокировок. Если для мониторов A и B соблюдается всеобщий порядок захвата AB (и соответственно отпускания BA), то ни с одним потоком не случится попасть на ожидание B, успешно при этом захватив A.
Из этого можно догадаться, простой способ гарантировать возможность дедлока – явно нарушить это условие.
Нарушение условия даст дедлок «скорее всего когда-нибудь». Чтобы получить его точно и с первого раза, нужно гарантировать, что оба потока окажутся на этапе между захватами одного и другого ресурса в одно время. Это можно сделать множеством способов, в примере ниже использован
CyclicBarrier
.Вопрос дедлоков – одна из краеугольных тем параллельных вычислений, уходящая далеко за рамки этого вопроса. Для дальнейшего изучения рекомендуются статьи на википедии про дедлоки, про задачу об обедающих философах как классическая иллюстрация проблемы, и глава 10.1 Java Concurrency in Practice.
#Многопоточность
👍3
В чём отличия интерфейса от абстрактного класса?
Главное отличие – это семантика. Интерфейсы появились еще до Java, как важная концепция ООП. Смысл интерфейса – некое поведение, описание свойства. Причем если придерживаться принципа сегрегации интерфейсов, это описание единственного аспекта поведения.
Класс, даже абстрактный – это комбинация всех свойств и их реализаций, которыми определяются сущности некоторой категории (собственно, класса).
Отсюда вытекает естественность и необходимость множественного наследования для интерфейсов. Опыт таких языков как C++ показал, что множественное наследование классов не нужно и проблемно (см. проблема ромбовидного наследования). По факту же обычно нужно всего лишь переиспользование кода, что не относится к ООП и реализуется в некоторых языках «интерфейсами с независимым состоянием» – примесями.
В Java интерфейс в отличие от абстрактного класса не может иметь состояния. Реализация поведения же допустима только в двух случаях: для статических методов, и
В интерфейсах, как публичных описаниях, не имеют смысла и запрещены непубличные члены. Отсюда синтаксическое отличие: модификатор
На уровне скомпилированного байткода тоже есть небольшие различия: интерфейс помечается флагом
И есть еще одно небольшое отличие. Интерфейс с одним методом можно использовать как функциональный, и инстанциировать лямбда-выражением. Для абстрактного класса даже с единственным методом такое не сработает.
#Классы
Главное отличие – это семантика. Интерфейсы появились еще до Java, как важная концепция ООП. Смысл интерфейса – некое поведение, описание свойства. Причем если придерживаться принципа сегрегации интерфейсов, это описание единственного аспекта поведения.
Класс, даже абстрактный – это комбинация всех свойств и их реализаций, которыми определяются сущности некоторой категории (собственно, класса).
Отсюда вытекает естественность и необходимость множественного наследования для интерфейсов. Опыт таких языков как C++ показал, что множественное наследование классов не нужно и проблемно (см. проблема ромбовидного наследования). По факту же обычно нужно всего лишь переиспользование кода, что не относится к ООП и реализуется в некоторых языках «интерфейсами с независимым состоянием» – примесями.
В Java интерфейс в отличие от абстрактного класса не может иметь состояния. Реализация поведения же допустима только в двух случаях: для статических методов, и
default
для обычных. Статические методы являются частью всего класса, а не экземпляров. Дефолтная реализация, как говорилось ранее, добавлена только как хак для сохранения совместимости.В интерфейсах, как публичных описаниях, не имеют смысла и запрещены непубличные члены. Отсюда синтаксическое отличие: модификатор
public
, как и abstract
для методов или static
для полей, можно не писать. Запрещены и модификаторы, несовместимые с abstract
: final
, synchronized
и прочие.На уровне скомпилированного байткода тоже есть небольшие различия: интерфейс помечается флагом
ACC_INTERFACE
а для класса генерируется конструктор по-умолчанию.И есть еще одно небольшое отличие. Интерфейс с одним методом можно использовать как функциональный, и инстанциировать лямбда-выражением. Для абстрактного класса даже с единственным методом такое не сработает.
#Классы
👍11
Конференция JPoint 2022 на день вернется в офлайн 24 июня.
Для всех, кто соскучился по живому общению с единомышленниками, команда JPoint сделала отдельный офлайн-день.
В теплом ламповом офлайне вас ждут:
✔ Доклады о фреймворках, тестировании на Java, архитектуре, многопоточности и не только.
✔ Дискуссии с участием спикеров после каждого доклада (вживую, а не в Zoom!).
✔ Круглые столы о JVM, Data Engineering в Java и собеседованиях разработчиков.
✔ Партнерские стенды с мини-докладами и возможностью получить мерч.
✔ Живое общение с единомышленниками.
📍Санкт-Петербург, Park Inn by Radisson Pulkovskaya, 24 июня
Вместе с билетом на офлайн-день вы получите доступ к записям более чем 30 докладов и других активностей с онлайн-части конференции.
Подробности, полную программу и билеты вы можете найти по ссылке.
Если покупаете билет за свой счет (а не за счет компании), то воспользуйтесь промокодом для получения скидки:
Для всех, кто соскучился по живому общению с единомышленниками, команда JPoint сделала отдельный офлайн-день.
В теплом ламповом офлайне вас ждут:
✔ Доклады о фреймворках, тестировании на Java, архитектуре, многопоточности и не только.
✔ Дискуссии с участием спикеров после каждого доклада (вживую, а не в Zoom!).
✔ Круглые столы о JVM, Data Engineering в Java и собеседованиях разработчиков.
✔ Партнерские стенды с мини-докладами и возможностью получить мерч.
✔ Живое общение с единомышленниками.
📍Санкт-Петербург, Park Inn by Radisson Pulkovskaya, 24 июня
Вместе с билетом на офлайн-день вы получите доступ к записям более чем 30 докладов и других активностей с онлайн-части конференции.
Подробности, полную программу и билеты вы можете найти по ссылке.
Если покупаете билет за свой счет (а не за счет компании), то воспользуйтесь промокодом для получения скидки:
bookjava2022JRGpc
👍4
Что если оба реализуемых интерфейса объявляют один и тот же метод? (1/2)
Если объявление полностью одинаково – нет никакой проблемы, класс-реализация должен просто определить этот метод.
Когда у обоих интерфейсов объявлены методы с одинаковой сигнатурой, но разными возвращаемыми типами – всё зависит от того, какие именно эти типы.
Переопределение метода (override) еще с Java 5 ковариантно относительно возвращаемого типа. То есть, в наследнике тип результата метода может быть наследником:
Если типы не связаны отношением наследования, например
Для примитивов никакой ковариантности возвращаемого типа нет. Даже если типы совместимы относительно присваивания:
Если различие в части throws, методы объявлены выбрасывающими разные типы исключений. Правила здесь те же, что для возвращаемых типов – работает ковариантность. Отличие лишь в том, что исключений примитивных типов не бывает, а даже для не являющихся родителем и наследником исключений всегда есть вариант, удовлетворяющий обоим – отсутствие выбрасываемых исключений вообще.
#Классы
Если объявление полностью одинаково – нет никакой проблемы, класс-реализация должен просто определить этот метод.
Когда у обоих интерфейсов объявлены методы с одинаковой сигнатурой, но разными возвращаемыми типами – всё зависит от того, какие именно эти типы.
Переопределение метода (override) еще с Java 5 ковариантно относительно возвращаемого типа. То есть, в наследнике тип результата метода может быть наследником:
super
метод возвращает Number
, @Override
метод возвращает Integer
.Если типы не связаны отношением наследования, например
String
и Long
– такой класс невозможно реализовать.Для примитивов никакой ковариантности возвращаемого типа нет. Даже если типы совместимы относительно присваивания:
int
→long
, int
→Integer
. В любом из таких случаев будет ошибка о несовместимости возвращаемых типов, для примитивов они должны совпадать в точности. Если различие в части throws, методы объявлены выбрасывающими разные типы исключений. Правила здесь те же, что для возвращаемых типов – работает ковариантность. Отличие лишь в том, что исключений примитивных типов не бывает, а даже для не являющихся родителем и наследником исключений всегда есть вариант, удовлетворяющий обоим – отсутствие выбрасываемых исключений вообще.
#Классы
👍5🔥1
Что если оба реализуемых интерфейса объявляют один и тот же метод? (2/2)
Если метод дефолтный в обоих интерфейсах, то есть снабжен реализацией. Компилятору изначально понятно, что невозможно будет на момент вызова определить, какой метод реально подразумевался. Так что еще на объявлении класса-реализации компилятор выдаст ошибку «inherits unrelated defaults».
В таком случае в классе необходимо переопределить этот общий метод, и явно перенаправить вызов в нужную родительскую реализацию. Для этого есть синтаксис явного указания нужного базового интерфейса
Ошибка появится даже в случае, когда реализации полностью совпадают. Если бы компилятор такое позволял, нельзя было бы безопасно изменить и перекомпилировать только одну из реализаций.
На практике с этой ситуацией можно столкнуться даже с классами стандартной библиотеки. Например, реализуя
Если в хоть одном из интерфейсов-предков метод не имеет дефолтной реализации, ошибка компиляции будет предлагать альтернативное решение – сделать класс абстрактным. Добавление ключевого слова
Других различий не бывает – изменение других модификаторов метода интерфейса недопустимо, а изменение списка параметров и имени делает его просто другим методом.
#Классы
Если метод дефолтный в обоих интерфейсах, то есть снабжен реализацией. Компилятору изначально понятно, что невозможно будет на момент вызова определить, какой метод реально подразумевался. Так что еще на объявлении класса-реализации компилятор выдаст ошибку «inherits unrelated defaults».
В таком случае в классе необходимо переопределить этот общий метод, и явно перенаправить вызов в нужную родительскую реализацию. Для этого есть синтаксис явного указания нужного базового интерфейса
MyBase.super.doSmth()
. См. пример ниже.Ошибка появится даже в случае, когда реализации полностью совпадают. Если бы компилятор такое позволял, нельзя было бы безопасно изменить и перекомпилировать только одну из реализаций.
На практике с этой ситуацией можно столкнуться даже с классами стандартной библиотеки. Например, реализуя
List
и Set
одним классом, вы получите эту ошибку для метода spliterator()
.Если в хоть одном из интерфейсов-предков метод не имеет дефолтной реализации, ошибка компиляции будет предлагать альтернативное решение – сделать класс абстрактным. Добавление ключевого слова
abstract
вернет вас в ту же неоднозначную ситуацию, и на ту же первоначальную ошибку.Других различий не бывает – изменение других модификаторов метода интерфейса недопустимо, а изменение списка параметров и имени делает его просто другим методом.
#Классы
👍2
Начните изучать Java бесплатно с нашим курсом «Основы языка Java».
Курс ориентирован на студентов, не знакомых с профессией и желающих понять его основы. Вы сможете рассмотреть такие необходимые понятия, как работа с ошибками, отладка, использование основных конструкций языка.
Всего 29 уроков, 105 проверочных тестов и 34 упражнения в тренажере.
Переходите прямо сейчас: https://clck.ru/rFRCL
Курс ориентирован на студентов, не знакомых с профессией и желающих понять его основы. Вы сможете рассмотреть такие необходимые понятия, как работа с ошибками, отладка, использование основных конструкций языка.
Всего 29 уроков, 105 проверочных тестов и 34 упражнения в тренажере.
Переходите прямо сейчас: https://clck.ru/rFRCL
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