Что делает семафор?
Семафор – один из старейших примитивов синхронизации. Он был изобретен Дейкстрой в 1968 году. По большому счету это счетчик, который можно увеличивать и уменьшать из разных потоков. Уменьшение до 0 блокирует уменьшающий поток. Состояние, когда счетчик больше нуля называют сигнальное состояние, операцию его увеличения – release (освобождение) или signal, уменьшения – acquire (захват) или wait.
На практике можно представить, что release – выделение квоты доступа к критической секции программы. acquire – использование необходимого объема доступной квоты, или ожидание, если её не хватает. Подробнее с деталями работы семафора поможет ознакомиться перевод статьи с картинками на хабре.
В Java семафор реализован классом
Несколько вспомогательных методов позволяют узнать больше о количестве и составе очереди потоков, которые ждут освобождения пермитов. А методы
Семафор – один из старейших примитивов синхронизации. Он был изобретен Дейкстрой в 1968 году. По большому счету это счетчик, который можно увеличивать и уменьшать из разных потоков. Уменьшение до 0 блокирует уменьшающий поток. Состояние, когда счетчик больше нуля называют сигнальное состояние, операцию его увеличения – release (освобождение) или signal, уменьшения – acquire (захват) или wait.
На практике можно представить, что release – выделение квоты доступа к критической секции программы. acquire – использование необходимого объема доступной квоты, или ожидание, если её не хватает. Подробнее с деталями работы семафора поможет ознакомиться перевод статьи с картинками на хабре.
В Java семафор реализован классом
Semaphore
. Состоит этот класс в основном из разных форм методов acquire
(с таймаутом, с игнорированием InterruptedException
, неблокирующий) и release
. Методы могут принимать параметр permits
– тот самый объем квот, которые необходимо освободить/захватить.Несколько вспомогательных методов позволяют узнать больше о количестве и составе очереди потоков, которые ждут освобождения пермитов. А методы
availablePermits
и drainPermits
позволяют узнать количество оставшихся пермитов, и захватить их все соответственно. В конструкторе конфигурируются изначальное количество пермитов, и свойство fair
(аналогичное свойству ReentrantLock).Wikipedia
Семафор (программирование)
примитив синхронизации и контроля доступа к ресурсам со счётчиком в основе, при попытке уменьшения которого ниже нуля задачи блокируются
Может ли имя класса не совпадать с именем файла?
Компилятор требует, чтобы в .java файле был не больше чем один публичный класс верхнего уровня, и чтобы его название совпадало с названием файла. Все специальные символы также должны быть в имени файла.
Protected и private классов верхнего уровня не бывает в принципе, а вот на package-protected это ограничение не распространяется. Это значит, что класс без модификатора доступа может иметь любое имя. Также это значит, что рядом с основным публичным классом файла (или вместо него) можно объявить любое количество других классов без модификатора доступа, с произвольными именами. Они будут доступны внутри всего пакета.
Так что ответ – может.
Компилятор требует, чтобы в .java файле был не больше чем один публичный класс верхнего уровня, и чтобы его название совпадало с названием файла. Все специальные символы также должны быть в имени файла.
Protected и private классов верхнего уровня не бывает в принципе, а вот на package-protected это ограничение не распространяется. Это значит, что класс без модификатора доступа может иметь любое имя. Также это значит, что рядом с основным публичным классом файла (или вместо него) можно объявить любое количество других классов без модификатора доступа, с произвольными именами. Они будут доступны внутри всего пакета.
Так что ответ – может.
Уже завтра пройдёт традиционный онлайн-митап для Java-разработчиков от ЮMoney — тех самых ребят, которые 18 лет занимаются платёжными решениями.
На нём backend-разработчики ЮMoney и приглашённый эксперт из Центра финансовых технологий расскажут как:
— добавлять в чистовой код тестовое поведение и спать спокойно,
— обеспечить отказоустойчивость с помощью шардирования,
— не попасть в Jar Hell.
А после докладов вы сможете задать любой наболевший вопрос и обсудить со спикерами темы. Участие бесплатное. Регистрируйся и делитесь ссылкой с коллегами: https://wow.link/tAV
До встречи в эфире!
На нём backend-разработчики ЮMoney и приглашённый эксперт из Центра финансовых технологий расскажут как:
— добавлять в чистовой код тестовое поведение и спать спокойно,
— обеспечить отказоустойчивость с помощью шардирования,
— не попасть в Jar Hell.
А после докладов вы сможете задать любой наболевший вопрос и обсудить со спикерами темы. Участие бесплатное. Регистрируйся и делитесь ссылкой с коллегами: https://wow.link/tAV
До встречи в эфире!
#вопросы_с_собеседований
Что такое Java Server Pages (JSP)?
Что такое Java Server Pages (JSP)?
С нас крутые спикеры, полезные лекции и трудоустройство, с тебя – желание учиться и минимум год опыта коммерческой разработки на Java.
⠀
Как все проходит?
3 раза в неделю на протяжении двух месяцев тебя будут обучать Senior’ы и Teamlead’ы ведущих банков страны. Обучение можно совмещать с работой.
⠀
Чему будут учить?
На курсе будем изучать Core Java, промышленную разработку на Java, базы данных, Spring, Kafka, Kubernetes и Istio. Помимо этого еще будут практические занятия и домашние задания.
⠀
Что будет после учебы?
Трудоустройство в Цифровые привычки. Ты будешь работать над высоконагруженными,отказоустойчивыми проектами.
⠀
⠀
Как все проходит?
3 раза в неделю на протяжении двух месяцев тебя будут обучать Senior’ы и Teamlead’ы ведущих банков страны. Обучение можно совмещать с работой.
⠀
Чему будут учить?
На курсе будем изучать Core Java, промышленную разработку на Java, базы данных, Spring, Kafka, Kubernetes и Istio. Помимо этого еще будут практические занятия и домашние задания.
⠀
Что будет после учебы?
Трудоустройство в Цифровые привычки. Ты будешь работать над высоконагруженными,отказоустойчивыми проектами.
⠀
JSP (JavaServer Pages) — платформонезависимая переносимая и легко расширяемая технология разработки веб-приложений, позволяющая веб-разработчикам создавать содержимое, которое имеет как статические, так и динамические компоненты. Страница JSP содержит текст двух типов: статические исходные данные, которые могут быть оформлены в одном из текстовых форматов HTML, SVG, WML, или XML, и JSP-элементы, которые конструируют динамическое содержимое. Кроме этого могут использоваться библиотеки JSP-тегов, а также EL (Expression Language), для внедрения Java-кода в статичное содержимое JSP-страниц.
Код JSP-страницы транслируется в Java-код сервлета с помощью компилятора JSP-страниц Jasper, и затем компилируется в байт-код JVM.
JSP-страницы загружаются на сервере и управляются Java EE Web Application. Обычно такие страницы упакованы в файловые архивы .war и .ear.
Код JSP-страницы транслируется в Java-код сервлета с помощью компилятора JSP-страниц Jasper, и затем компилируется в байт-код JVM.
JSP-страницы загружаются на сервере и управляются Java EE Web Application. Обычно такие страницы упакованы в файловые архивы .war и .ear.
Как получить гарантированный дедлок?
Сначала поговорим о том, что это такое. 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.
Какая разница между @ElementCollection, @OneToMany и @ManyToMany?
Все эти аннотации – часть Java Persistence API. С их использованием мы регулярно сталкиваемся в реализациях JPA, таких как Hibernate.
Когда в базу данных сохраняется сущность, в которой есть поле-коллекция, это поле обязано быть помеченным одной из аннотаций.
@OneToMany и @ManyToMany хранят вложенные объекты как отдельные полноценные сущности – для них действуют всё те же требования, которые JPA выдвигает для всех
@ElementCollection создает коллекцию встраиваемых классов. Применять её можно только на коллекции, тип элементов которых помечен
На уровне хранения в реляционной базе, для
Но из Java кода коллекция будет выглядеть встроенной: её элементом не нужно иметь собственные id, ими нельзя манипулировать отдельно от основной сущности. Единственное, чем такая коллекция отличается от встроенного поля-примитива – её можно загружать лениво (включено по умолчанию).
#proglib_contest
Все эти аннотации – часть Java Persistence API. С их использованием мы регулярно сталкиваемся в реализациях JPA, таких как Hibernate.
Когда в базу данных сохраняется сущность, в которой есть поле-коллекция, это поле обязано быть помеченным одной из аннотаций.
@OneToMany и @ManyToMany хранят вложенные объекты как отдельные полноценные сущности – для них действуют всё те же требования, которые JPA выдвигает для всех
@Entity
классов. Каждая из аннотаций отвечает за свое отношение.@ElementCollection создает коллекцию встраиваемых классов. Применять её можно только на коллекции, тип элементов которых помечен
@Embeddable
, или входит в список стандартных встраиваемых классов (обертки примитивов, строки, даты, и т.д.).На уровне хранения в реляционной базе, для
@ElementCollection
будет также создана отдельная таблица. Технически она будет находиться в отношении one-to-many.Но из Java кода коллекция будет выглядеть встроенной: её элементом не нужно иметь собственные id, ими нельзя манипулировать отдельно от основной сущности. Единственное, чем такая коллекция отличается от встроенного поля-примитива – её можно загружать лениво (включено по умолчанию).
#proglib_contest
#proglib_contest
10 лучших книг по Java
В этой статье собраны некоторые из лучших когда-либо написанных книг по джава. Эти книги выдержали испытание временем и с годами становятся все более актуальными.
Туц: https://proglib.io/w/42296296
10 лучших книг по Java
В этой статье собраны некоторые из лучших когда-либо написанных книг по джава. Эти книги выдержали испытание временем и с годами становятся все более актуальными.
Туц: https://proglib.io/w/42296296
Teletype
10 лучших книг по Java
Некоторые из лучших книг для Java-программистов, начиная от ядра Java и заканчивая передовыми практиками, модульным тестированием...
#proglib_contest Обработка какого массива в Java выполняется быстрее?
Обработка какого массива в Java быстрее?
Anonymous Quiz
49%
Отсортированного
5%
Неотсортированного
46%
Неважно какого
Какие у аннотации бывают таргеты?
Мета-аннотация
• TYPE – Объявление класса, интерфейса, аннотации или enum-а.
• FIELD – Объявление поля (включая константы enum-ов).
• METHOD – Объявление метода.
• PARAMETER – Формальный параметр в объявлении метода.
• CONSTRUCTOR – Объявление конструктора.
• LOCAL_VARIABLE – Объявление локальной переменной.
• ANNOTATION_TYPE – Объявление аннотации. Применяется для создания мета-аннотации.
• PACKAGE – Объявление пакета (в
–– С Java 8 ––
• TYPE_PARAMETER – Обявление generic типа-параметра.
• TYPE_USE – Любое использование типа. Например приведение:
–– С Java 9 ––
• MODULE – Объявление модуля.
#proglib_contest
Мета-аннотация
@Target
определяет, в каком контексте может применяться объявляемая аннотация. Допустимые контексты перечисляются значениями ElementType
. По умолчанию, если @Target
не указан, разрешены все контексты кроме TYPE_PARAMETER
. Возможные таргеты:• TYPE – Объявление класса, интерфейса, аннотации или enum-а.
• FIELD – Объявление поля (включая константы enum-ов).
• METHOD – Объявление метода.
• PARAMETER – Формальный параметр в объявлении метода.
• CONSTRUCTOR – Объявление конструктора.
• LOCAL_VARIABLE – Объявление локальной переменной.
• ANNOTATION_TYPE – Объявление аннотации. Применяется для создания мета-аннотации.
• PACKAGE – Объявление пакета (в
package-info.java
).–– С Java 8 ––
• TYPE_PARAMETER – Обявление generic типа-параметра.
• TYPE_USE – Любое использование типа. Например приведение:
(@NonNull String) myObject
.–– С Java 9 ––
• MODULE – Объявление модуля.
#proglib_contest
Forwarded from Библиотека питониста | Python, Django, Flask
Подходит к концу эпический конкурс на самый интересный контент в телеграм-каналах Библиотеки программиста. Посты собирают всё больше откликов — спасибо за ваши старания!
У всех, кто хотел поучаствовать, остался последний шанс побороться за 20 000 ₽ в каждом из каналов: @progbook, @proglibrary, @pyproglib, @frontendproglib, @javaproglib, @dsproglib, @phpproglib, @cppproglib, @mobileproglib, @goproglib, @csharpproglib, @devopsslib, @testerlib, @hackproglib. Общий призовой фонд 280 000 ₽.
До полуночи примем последние посты — в некоторых каналах шансы на победу всё ещё высокие. Лайфхак: эти каналы нетрудно вычислить по хэштегу #proglib_contest 😉.
Напоминаем, как участвовать: пишем анонс до 700 знаков к любой актуальной айтишной статье 2020-21 годов или рецензию книги для @progbook. Отправляем получившийся текст и название канала боту @proglib_contest_bot. Чей пост в канале наберёт больше откликов, тот и выиграл.
Через три дня подведем итоги и огласим список победителей. Юридическая информация: https://proglib.io/best-post-contest.
У всех, кто хотел поучаствовать, остался последний шанс побороться за 20 000 ₽ в каждом из каналов: @progbook, @proglibrary, @pyproglib, @frontendproglib, @javaproglib, @dsproglib, @phpproglib, @cppproglib, @mobileproglib, @goproglib, @csharpproglib, @devopsslib, @testerlib, @hackproglib. Общий призовой фонд 280 000 ₽.
До полуночи примем последние посты — в некоторых каналах шансы на победу всё ещё высокие. Лайфхак: эти каналы нетрудно вычислить по хэштегу #proglib_contest 😉.
Напоминаем, как участвовать: пишем анонс до 700 знаков к любой актуальной айтишной статье 2020-21 годов или рецензию книги для @progbook. Отправляем получившийся текст и название канала боту @proglib_contest_bot. Чей пост в канале наберёт больше откликов, тот и выиграл.
Через три дня подведем итоги и огласим список победителей. Юридическая информация: https://proglib.io/best-post-contest.
Библиотека программиста
Правила проведения публичного конкурса
Материалы, которые научат и помогут программировать. Книги и лекции, видеоуроки и советы, тесты знаний и обсуждение горячих тем. Присоединяйтесь!
#вопросы_с_собеседований
Расскажите про основные понятия ООП: «класс», «объект», «интерфейс».
Расскажите про основные понятия ООП: «класс», «объект», «интерфейс».
Класс – это способ описания сущности, определяющий состояние и поведение, зависящее от этого состояния, а также правила для взаимодействия с данной сущностью (контракт).
С точки зрения программирования класс можно рассматривать как набор данных (полей, атрибутов, членов класса) и функций для работы с ними (методов).
С точки зрения структуры программы класс является сложным типом данных.
Объект (экземпляр) – это отдельный представитель класса, имеющий конкретное состояние и поведение, полностью определяемое классом. Каждый объект имеет конкретные значения атрибутов и методы, работающие с этими значениями на основе правил, заданных в классе.
Интерфейс – это набор методов класса, доступных для использования. Интерфейсом класса будет являться набор всех его публичных методов в совокупности с набором публичных атрибутов. По сути, интерфейс специфицирует класс, чётко определяя все возможные действия над ним.
С точки зрения программирования класс можно рассматривать как набор данных (полей, атрибутов, членов класса) и функций для работы с ними (методов).
С точки зрения структуры программы класс является сложным типом данных.
Объект (экземпляр) – это отдельный представитель класса, имеющий конкретное состояние и поведение, полностью определяемое классом. Каждый объект имеет конкретные значения атрибутов и методы, работающие с этими значениями на основе правил, заданных в классе.
Интерфейс – это набор методов класса, доступных для использования. Интерфейсом класса будет являться набор всех его публичных методов в совокупности с набором публичных атрибутов. По сути, интерфейс специфицирует класс, чётко определяя все возможные действия над ним.
Можно ли выбрасывать исключение generic-типа?
Короткий ответ – да. Как в большинстве каверзных вопросов про дженерики, ответ становится очевидным если подумать, во что сотрутся типы-параметры.
Чтобы объявить, что метод выбрасывает исключение обобщенного типа
Короткий ответ – да. Как в большинстве каверзных вопросов про дженерики, ответ становится очевидным если подумать, во что сотрутся типы-параметры.
Чтобы объявить, что метод выбрасывает исключение обобщенного типа
T
, этот тип T
должен быть объявлен расширяющим Throwable
. Именно в Throwable
в таком случае сотрется T
при компиляции. Также в качестве типа-верхней границы можно использовать любого наследника Throwable
:class MyClass<T extends IOException> {
void foo() throws T {
// ...
}
}
This media is not supported in your browser
VIEW IN TELEGRAM
Готовы хакнуть онлайн-магазин М.ВидеоЭльдорадо и обнулить цены на топовую игровую технику и iPhone 12?📱
Участвуйте в битве Tech monsters night от М.ВидеоЭльдорадо, решите задачи конкурса лучше и быстрее других — и получите шанс обладать одним из тридцати крутых призов, оригинальным мерчем и должностью в компании.
Когда:
🔘 17.05-03.06 — Пройдите регистрацию в личном кабинете и ловите уведомления организатора в телеграм-канале.
🔘 04.06-05.06 — Tech Monsters Night: решайте задачи битвы с 22:00 до 03:00, и сразу знакомьтесь с результатами.
🔘 05.05-01.08 — Забирайте свой фирменный мерч или мощную технику. Лучший получит возможность выиграть one night offer.
Зарегистрироваться - https://i.techmn.ru/Cgbwp
До встречи на Tech Monsters Night 🌃
Кто монстр, тот знает.
Участвуйте в битве Tech monsters night от М.ВидеоЭльдорадо, решите задачи конкурса лучше и быстрее других — и получите шанс обладать одним из тридцати крутых призов, оригинальным мерчем и должностью в компании.
Когда:
🔘 17.05-03.06 — Пройдите регистрацию в личном кабинете и ловите уведомления организатора в телеграм-канале.
🔘 04.06-05.06 — Tech Monsters Night: решайте задачи битвы с 22:00 до 03:00, и сразу знакомьтесь с результатами.
🔘 05.05-01.08 — Забирайте свой фирменный мерч или мощную технику. Лучший получит возможность выиграть one night offer.
Зарегистрироваться - https://i.techmn.ru/Cgbwp
До встречи на Tech Monsters Night 🌃
Кто монстр, тот знает.
Какие существуют стандартные загрузчики классов?
В JVM встроено как минимум три стандартных загрузчика:
🔘 Bootstrap – встроенная в JVM нативная реализация, родитель для всех остальных загрузчиков. Загружает часть стандартных классов
🔘 Platform – отвечает за загрузку стандартных классов Java-рантайма. До Java 9 назывался Extension и занимался загрузкой расширений. Гарантируется, что ему будут видны (но не факт что загружены непосредственно им) все стандартные классы Java SE и JDK;
🔘 System (Application) – загружает классы из classpath) конкретного приложения;
Перед тем как загрузить класс,
Иллюстрация смысла этой иерархии – загрузчики web-сервера Apache Tomcat. Прикладной код каждого web-приложения работает на своем отдельном загрузчике изолированно от других приложений. Даже один и тот же класс-singleton у каждого приложения будет собственный. Системные классы и общие библиотеки при том грузятся их родительскими загрузчиками, только один раз для сервера.
#Классы
В JVM встроено как минимум три стандартных загрузчика:
🔘 Bootstrap – встроенная в JVM нативная реализация, родитель для всех остальных загрузчиков. Загружает часть стандартных классов
java.*
;🔘 Platform – отвечает за загрузку стандартных классов Java-рантайма. До Java 9 назывался Extension и занимался загрузкой расширений. Гарантируется, что ему будут видны (но не факт что загружены непосредственно им) все стандартные классы Java SE и JDK;
🔘 System (Application) – загружает классы из classpath) конкретного приложения;
Перед тем как загрузить класс,
ClassLoader
проверит, не может ли это сделать его родитель. Если класс уже загружен, то загрузка не потребуется.Иллюстрация смысла этой иерархии – загрузчики web-сервера Apache Tomcat. Прикладной код каждого web-приложения работает на своем отдельном загрузчике изолированно от других приложений. Даже один и тот же класс-singleton у каждого приложения будет собственный. Системные классы и общие библиотеки при том грузятся их родительскими загрузчиками, только один раз для сервера.
#Классы
Давно думали над переходом от разработчика к тимлиду? Тогда успейте записаться на бесплатный вебинар от GeekBrains X AGIMA и узнайте, из кого получаются хорошие тимлиды.
- Почему тимлид в AGIMA считается отдельной профессией, а не ролью;
- Какие навыки тимлида ценятся на рынке и в компании AGIMA;
- Как разработчики становятся тимлидами и как мы выстраиваем институт тимлидерства.
За 1,5 часа вы сможете послушать выступление, задать интересующие вопросы и прокачать свои скиллы. Как бонус вы получаете методические материалы и запись вебинара.
Вебинар состоится 27 мая в 19:00. Узнавайте подробности и записывайтесь здесь. Перед началом вебинара отправляется уведомление.
- Почему тимлид в AGIMA считается отдельной профессией, а не ролью;
- Какие навыки тимлида ценятся на рынке и в компании AGIMA;
- Как разработчики становятся тимлидами и как мы выстраиваем институт тимлидерства.
За 1,5 часа вы сможете послушать выступление, задать интересующие вопросы и прокачать свои скиллы. Как бонус вы получаете методические материалы и запись вебинара.
Вебинар состоится 27 мая в 19:00. Узнавайте подробности и записывайтесь здесь. Перед началом вебинара отправляется уведомление.