👩💻 Как стать востребованным Java-разработчиком с нуля?
Получить все необходимые навыки до уровня Middle на комплексном онлайн-курсе «Специализация Java-разработчик» от OTUS.
После обучения вы сможете:
➡️ Создавать приложения на Java
➡️ Работать с реляционными базами данных
➡️ Разрабатывать серверные веб-приложения
➡️ Претендовать на позиции Middle Java Developer
📌Вы освоите все необходимые инструменты, создадите выпускной проект под руководством опытных специалистов из ведущих компаний и добавите его в портфолио.
➡️ Оставьте заявку прямо сейчас и получите спеццену на курс: https://vk.cc/cxY5lG
Получить все необходимые навыки до уровня Middle на комплексном онлайн-курсе «Специализация Java-разработчик» от OTUS.
После обучения вы сможете:
➡️ Создавать приложения на Java
➡️ Работать с реляционными базами данных
➡️ Разрабатывать серверные веб-приложения
➡️ Претендовать на позиции Middle Java Developer
📌Вы освоите все необходимые инструменты, создадите выпускной проект под руководством опытных специалистов из ведущих компаний и добавите его в портфолио.
➡️ Оставьте заявку прямо сейчас и получите спеццену на курс: https://vk.cc/cxY5lG
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Чем отличается ReentrantLock от обычного Lock?
Примеры не-reentrant локов из стандартной библиотеки – представления класса StampedLock, возвращаемые его методами
👉
Lock
– это интерфейс, ReentrantLock
– его реализация. «Reentrant» говорит о том, что один и тот же поток может перезахватывать уже захваченный лок. Интерфейс не требует этого свойства. Обычный блок synchronized
тоже является reentrant
– вложенная синхронизация на том же мониторе отработает без проблем.Примеры не-reentrant локов из стандартной библиотеки – представления класса StampedLock, возвращаемые его методами
asReadLock()
и asWriteLock()
.👉
«Код Ход Шоу» от Т-Банка для тех, кто работает на Java или только вкатывается:
— Необычный формат крестиков-ноликов. Участникам задают вопросы на знание Java, и если они отвечают правильно — могут поставить знак.
— Команды разработчиков из бигтеха (Т-Банк, Яндекс, Вертикаль, X5 Tech, Сбер, Samokat. tech и другие).
— Победитель проходит дальше, а в финале встретятся две лучшие команды.
Смотрите ютуб-шоу и подписывайтесь на телеграм-канал с анонсами новых выпусков и другими полезными материалами по Java.
erid:2VtzqvCp6uD
Реклама. АО "Тинькофф Банк", ИНН 7710140679, лицензия ЦБ РФ № 2673
— Необычный формат крестиков-ноликов. Участникам задают вопросы на знание Java, и если они отвечают правильно — могут поставить знак.
— Команды разработчиков из бигтеха (Т-Банк, Яндекс, Вертикаль, X5 Tech, Сбер, Samokat. tech и другие).
— Победитель проходит дальше, а в финале встретятся две лучшие команды.
Смотрите ютуб-шоу и подписывайтесь на телеграм-канал с анонсами новых выпусков и другими полезными материалами по Java.
erid:2VtzqvCp6uD
Реклама. АО "Тинькофф Банк", ИНН 7710140679, лицензия ЦБ РФ № 2673
Что выбрать, Stack или Queue?
Queue – один из основных интерфейсов Java Collections Framework. В общем случае (но не обязательно) представляет FIFO-коллекцию – элементы можно добавлять в хвост, брать или удалять из головы. Его наследник, интерфейс
Stack – LIFO коллекция. То есть добавлять и удалять элементы можно только с одного конца. Кроме того, стек наследуется от Vector, и тоже является пересинхронизированным и устаревшим. Его документация явно рекомендует предпочесть использовать
👉
Queue – один из основных интерфейсов Java Collections Framework. В общем случае (но не обязательно) представляет FIFO-коллекцию – элементы можно добавлять в хвост, брать или удалять из головы. Его наследник, интерфейс
Deque
(double ended queue, двусторонняя очередь), позволяет манипулировать элементами на обеих сторонах.Stack – LIFO коллекция. То есть добавлять и удалять элементы можно только с одного конца. Кроме того, стек наследуется от Vector, и тоже является пересинхронизированным и устаревшим. Его документация явно рекомендует предпочесть использовать
Deque
.👉
Подборка Telegram каналов для программистов
Системное администрирование 📌
Типичный Сисадмин (фото железа, было/стало)
Книги для админов, полезные материалы
Все для системного администратора
Библиотека Системного Администратора
Чат системных администраторов
DevOps: Пишем о Docker, Kubernetes и др.
Новости Линукс Linux
Новости высоких технологий, науки и техники💡
Мир технологий (Technology World)
Полезный контент по программированию на Rust
Библиотека Go (Golang) разработчика
Программисты, дизайнеры, новости из мира IT.
Обучающие видео, книги по Физике и Математике
Библиотека PHP программиста 👨🏼💻👩💻
Подборки по Node js и все что с ним связано
Библиотека Ruby программиста
1C разработка 📌
Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
Библиотека C/C++ разработчика
Книги для программистов C/C++
Учим C/C++ на примерах
Программирование Python 📌
Python академия. Учи Python быстро и легко🐍
Библиотека Python разработчика
Python подборки на русском и английском
Книги по Python Rus
Java разработка 📌
Библиотека Java разработчика
Книги по Java Rus
Учим Java на примерах
GitHub Сообщество 📌
Интересное из GitHub
Базы данных (Data Base) 📌
Все про базы данных
Мобильная разработка: iOS, Android 📌
Мобильная разработка
Подборки полезного материала по Kotlin
Фронтенд разработка 📌
Подборки для frontend разработчиков
Frontend советы, примеры и практика!
Подборки по React js и все что с ним связано
Разработка игр 📌
Все о разработке игр
Вакансии 📌
Системный Администратор
Вакансии в IT
Чат программистов📌
Библиотеки 📌
Книги для программистов Rus
Книги по программированию
Библиотека программиста
Книги для программистов
Книги для программистов
БигДата, машинное обучение 📌
Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
Лекции, видеоуроки, доклады с IT конференций
Полезные советы по программированию
QA, тестирование 📌
Библиотека тестировщика
Шутки программистов 📌
Шутки программистов
Защита, взлом, безопасность 📌
Канал о кибербезопасности
Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
Статьи, книги для дизайнеров
Английский 📌
Английский с нуля
Математика 📌
Канал по математике
Excel лайфхак📌
Системное администрирование 📌
Типичный Сисадмин (фото железа, было/стало)
Книги для админов, полезные материалы
Все для системного администратора
Библиотека Системного Администратора
Чат системных администраторов
DevOps: Пишем о Docker, Kubernetes и др.
Новости Линукс Linux
Новости высоких технологий, науки и техники💡
Мир технологий (Technology World)
Полезный контент по программированию на Rust
Библиотека Go (Golang) разработчика
Программисты, дизайнеры, новости из мира IT.
Обучающие видео, книги по Физике и Математике
Библиотека PHP программиста 👨🏼💻👩💻
Подборки по Node js и все что с ним связано
Библиотека Ruby программиста
1C разработка 📌
Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
Библиотека C/C++ разработчика
Книги для программистов C/C++
Учим C/C++ на примерах
Программирование Python 📌
Python академия. Учи Python быстро и легко🐍
Библиотека Python разработчика
Python подборки на русском и английском
Книги по Python Rus
Java разработка 📌
Библиотека Java разработчика
Книги по Java Rus
Учим Java на примерах
GitHub Сообщество 📌
Интересное из GitHub
Базы данных (Data Base) 📌
Все про базы данных
Мобильная разработка: iOS, Android 📌
Мобильная разработка
Подборки полезного материала по Kotlin
Фронтенд разработка 📌
Подборки для frontend разработчиков
Frontend советы, примеры и практика!
Подборки по React js и все что с ним связано
Разработка игр 📌
Все о разработке игр
Вакансии 📌
Системный Администратор
Вакансии в IT
Чат программистов📌
Библиотеки 📌
Книги для программистов Rus
Книги по программированию
Библиотека программиста
Книги для программистов
Книги для программистов
БигДата, машинное обучение 📌
Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
Лекции, видеоуроки, доклады с IT конференций
Полезные советы по программированию
QA, тестирование 📌
Библиотека тестировщика
Шутки программистов 📌
Шутки программистов
Защита, взлом, безопасность 📌
Канал о кибербезопасности
Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
Статьи, книги для дизайнеров
Английский 📌
Английский с нуля
Математика 📌
Канал по математике
Excel лайфхак📌
Чем отличается Servlet Container от Application Server?
JavaEE – это стандарт, набор соглашений. Разделяется на множество отдельных самостоятельных спецификаций технологий. В JDK поставляется в виде только интерфейсов и документации, но не их реализации.
Application Server – это полная реализация всех спецификаций стандарта JavaEE: распределенные транзакции, EJB, пуллинг соединений к БД и т.д.. Используется для хостинга полноценных enterprise-приложений (.ear). Примеры – JBoss, TomEE, Glassfish, WebSphere.
Servlet Container (web server) – это реализация минимальной необходимой части JavaEE – Servlet API и JSP. Умеет хостить статический контент, jsp-страницы и выполнять Java код сервлетов. Остальные спецификации JavaEE при необходимости добавляются сторонними библиотеками-реализациями. Примеры – Tomcat, Jetty.
Каждый сервер приложений содержит в себе контейнер сервлетов. Spring Framework – альтернатива JEE, поэтому для запуска приложения на основе Spring обычно достаточно веб-контейнера. Если же приложение использует всю мощь JEE, необходим сервер приложений.
👉
JavaEE – это стандарт, набор соглашений. Разделяется на множество отдельных самостоятельных спецификаций технологий. В JDK поставляется в виде только интерфейсов и документации, но не их реализации.
Application Server – это полная реализация всех спецификаций стандарта JavaEE: распределенные транзакции, EJB, пуллинг соединений к БД и т.д.. Используется для хостинга полноценных enterprise-приложений (.ear). Примеры – JBoss, TomEE, Glassfish, WebSphere.
Servlet Container (web server) – это реализация минимальной необходимой части JavaEE – Servlet API и JSP. Умеет хостить статический контент, jsp-страницы и выполнять Java код сервлетов. Остальные спецификации JavaEE при необходимости добавляются сторонними библиотеками-реализациями. Примеры – Tomcat, Jetty.
Каждый сервер приложений содержит в себе контейнер сервлетов. Spring Framework – альтернатива JEE, поэтому для запуска приложения на основе Spring обычно достаточно веб-контейнера. Если же приложение использует всю мощь JEE, необходим сервер приложений.
👉
🎲 Школа эксплуатации Kubernetes. Бесплатно!
Привет! Мы — команда Слёрма, учебный центр для айти-специалистов middle+ и фанаты k8s😎
За 5 лет на рынке мы создали несколько громких проектов по кубам — открытую вечернюю школу, флагманские курсы для инженеров, разработчиков и специалистов по информационной безопасности.
Теперь, вместе с Кириллом Борисовым, SRE Lead в MTS Digital и спикером наших курсов, мы запускаем новый бесплатный проект — «Школу эксплуатации Kubernetes». В прямых эфирах школы будем решать реальные кейсы и разбираться с трудностями, которые можно встретить при переходе от теории к практике работы с k8s.
Расписание эфиров и полезные материалы о кубах публикуем в нашем телеграм-канале. Подписывайтесь, чтобы присоединиться🔥
🔗 ШКОЛА ЭКСПЛУАТАЦИИ KUBERNETES
Реклама ООО «Слёрм» ИНН 3652901451 erid: 2Vtzqw6Q8Ti
Привет! Мы — команда Слёрма, учебный центр для айти-специалистов middle+ и фанаты k8s😎
За 5 лет на рынке мы создали несколько громких проектов по кубам — открытую вечернюю школу, флагманские курсы для инженеров, разработчиков и специалистов по информационной безопасности.
Теперь, вместе с Кириллом Борисовым, SRE Lead в MTS Digital и спикером наших курсов, мы запускаем новый бесплатный проект — «Школу эксплуатации Kubernetes». В прямых эфирах школы будем решать реальные кейсы и разбираться с трудностями, которые можно встретить при переходе от теории к практике работы с k8s.
Расписание эфиров и полезные материалы о кубах публикуем в нашем телеграм-канале. Подписывайтесь, чтобы присоединиться🔥
🔗 ШКОЛА ЭКСПЛУАТАЦИИ KUBERNETES
Реклама ООО «Слёрм» ИНН 3652901451 erid: 2Vtzqw6Q8Ti
Как получить текущий метод
В общем виде задача сводится к получению текущего стек-трейса, и взятию его верхнего элемента. Гарантированного способа не существует, потому что JVM имеет право «терять» фреймы стека (то есть методы цепочки вызовов) при оптимизации.
1. new Exception().printStackTrace(printStream)
Печатает стек-трейс в текстовом виде в поток. Первой строкой выводится toString() объекта Exception, далее стек вызовов до места создания исключения. Соответственно, из потока нужно будет достать и распарсить вторую строку. В зависимости от JVM формат вывода может отличаться.
2. Thread.currentThread().getStackTrace()
3. new Exception().getStackTrace()
Более красивые способы. Возвращают уже массив готовых объектов-фреймов, нужно только взять первый элемент. Эти вызовы дорогие, они всегда загружают весь стек, даже если нужен первый фрейм. От класса-владельца метода в возвращаемом StackTraceElement доступна только строка имени, для доступа через Reflection придется загружать его вручную.
4. StackWalker.getInstance(options, depth).walk(s -> ...)
Самый продвинутый способ, доступный с Java 9 – специально предназначенный для этого класс. Параметрами метода getInstance() можно ограничивать необходимую глубину и детализацию стека. Результаты – экземпляры StackFrame – содержат готовый для рефлекшна Class<?> вызывающего объекта.
👉
В общем виде задача сводится к получению текущего стек-трейса, и взятию его верхнего элемента. Гарантированного способа не существует, потому что JVM имеет право «терять» фреймы стека (то есть методы цепочки вызовов) при оптимизации.
1. new Exception().printStackTrace(printStream)
Печатает стек-трейс в текстовом виде в поток. Первой строкой выводится toString() объекта Exception, далее стек вызовов до места создания исключения. Соответственно, из потока нужно будет достать и распарсить вторую строку. В зависимости от JVM формат вывода может отличаться.
2. Thread.currentThread().getStackTrace()
3. new Exception().getStackTrace()
Более красивые способы. Возвращают уже массив готовых объектов-фреймов, нужно только взять первый элемент. Эти вызовы дорогие, они всегда загружают весь стек, даже если нужен первый фрейм. От класса-владельца метода в возвращаемом StackTraceElement доступна только строка имени, для доступа через Reflection придется загружать его вручную.
4. StackWalker.getInstance(options, depth).walk(s -> ...)
Самый продвинутый способ, доступный с Java 9 – специально предназначенный для этого класс. Параметрами метода getInstance() можно ограничивать необходимую глубину и детализацию стека. Результаты – экземпляры StackFrame – содержат готовый для рефлекшна Class<?> вызывающего объекта.
👉
10 лучших практик производительности Spring Boot
Spring Framework - один из самых популярных и известных фреймворков для разработки приложений в экосистеме Java, а Spring Boot упрощает процесс создания приложений на базе Spring, предоставляя предварительно настроенные модули, автоматическую конфигурацию, стартовые зависимости и многое другое. Такая простота, популярность и стабильность привели к тому, что многие системы были реализованы с помощью Spring Boot, и вполне возможно, что некоторые из них не оптимизированы и не производительны.
В этой статье мы сначала обсудим, что такое производительность в целом, а затем рассмотрим 10 лучших практик производительности Spring Boot, чтобы сделать наш Spring Boot быстрым и ресурсоэффективным.
https://digma.ai/10-spring-boot-performance-best-practices/
👉
Spring Framework - один из самых популярных и известных фреймворков для разработки приложений в экосистеме Java, а Spring Boot упрощает процесс создания приложений на базе Spring, предоставляя предварительно настроенные модули, автоматическую конфигурацию, стартовые зависимости и многое другое. Такая простота, популярность и стабильность привели к тому, что многие системы были реализованы с помощью Spring Boot, и вполне возможно, что некоторые из них не оптимизированы и не производительны.
В этой статье мы сначала обсудим, что такое производительность в целом, а затем рассмотрим 10 лучших практик производительности Spring Boot, чтобы сделать наш Spring Boot быстрым и ресурсоэффективным.
https://digma.ai/10-spring-boot-performance-best-practices/
👉
👩💻 Тест по Java от OTUS
Проверь насколько хорошо ты знаешь Java и готов освоить Spring!
Ответишь — пройдешь на продвинутый курс "Разработчик на Spring Framework" от OTUS по специальной цене.
➡️ ПРОЙТИ ТЕСТ: https://vk.cc/cy8cfC
🎫 Курс можно приобрести в рассрочку
Проверь насколько хорошо ты знаешь Java и готов освоить Spring!
Ответишь — пройдешь на продвинутый курс "Разработчик на Spring Framework" от OTUS по специальной цене.
➡️ ПРОЙТИ ТЕСТ: https://vk.cc/cy8cfC
🎫 Курс можно приобрести в рассрочку
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Как используется метод Lock.newCondition()?
Если реализации интерфейса
Как и ожидание на мониторе,
Конкретные реализации
Возвращаясь к поставленному вопросу,
👉
Если реализации интерфейса
Lock
представляют высокоуровневую альтернативу блока synchronized, то реализации его спутника, интерфейса Condition
– альтернатива методам notify/wait. Оба этих интерфейса относятся к пакету java.util.concurrent.locks
.Как и ожидание на мониторе,
Condition
реализует примитив синхронизации «Условная переменная». Один или несколько потоков зависают на объекте-кондишне с помощью варианта метода await (ждут удовлетворения условия). Другой поток пробуждает их методами signal
и signalAll
(сигнализирует об удовлетворении условия).Конкретные реализации
Condition
всегда решают те же задачи, что блокировка на мониторе, но в теории могут отличаться в нюансах поведения. Например, может не быть требования вызывать ожидание/сигнал только при захваченном локе (аналог требования, по которому notify/wait
всегда вызываются в synchronized
). Или может гарантироваться порядок получения сигнала ожидающими потоками.Возвращаясь к поставленному вопросу,
Condition
всегда связан со своим объектом типа Lock
, и метод Lock.newCondition()
– единственный правильный способ создания кондишна.👉