ConcurrentHashMap – это высокопроизводительная реализация Map, специально разработанная для многопоточной среды. Она гарантирует безопасность данных при одновременном доступе и минимизирует использование блокировок.
🔹 Сегментация данных (до 8 java): Данные разделялись на сегменты, и блокировка происходила на уровне сегмента, а не всей карты. Это обеспечивало параллельный доступ к разным частям карты.
🔹 Кассовые таблицы (Java 8+): Вместо сегментов используется структура на основе Node[] – массив узлов. Это сделало структуру более гибкой. Вместо сегментации применяется механизм Fine-Grained Locking и Compare-And-Swap:
- Compare-And-Swap используется для операций записи, что позволяет избегать блокировок для большинства операций. Операции с разными бакетами могут выполняться параллельно, поскольку локальная блокировка применяется только к отдельному узлу или бакету.
- Fine-Grained Locking минимизирует область блокировок. Например, если требуется масштабирование (resize) или обработка коллизий, потоки могут продолжать работу с другими бакетами, даже если один из них временно заблокирован.
- synchronized применяется только для случаев, когда CAS не справляется (например, при реорганизации данных или сложных операциях). Это помогает поддерживать баланс между безопасностью и производительностью.
🔹 Масштабируемый массив (Resizable Array): Масштабирование в ConcurrentHashMap происходит градуально, чтобы избежать блокировки всей структуры. Новый массив создаётся с увеличенным размером, и данные переносятся постепенно, по частям. Во время переноса используется специальный узел ForwardingNode, который перенаправляет операции к новому массиву, обеспечивая корректную работу всех потоков.
📚 Основные методы:
▪️ get(Object key):
Легковесная операция, не требует блокировок. Ключ хэшируется, затем вычисляется индекс сегмента. Если в сегменте есть соответствующий узел, он возвращается.
▪️ put(K key, V value):
- Сначала используется CAS для вставки нового элемента.
- Если CAS не срабатывает (например, при наличии коллизии), включается локальная блокировка на соответствующей корзине.
▪️ computeIfAbsent/compute:
Более сложные операции, которые комбинируют вычисления с модификацией. Используются короткие локи для минимизации блокировки других потоков.
- ConcurrentHashMap не допускает хранения null для ключей и значений. Это связано с невозможностью различать отсутствие значения и реальное хранение null.
- Итерации по карте предоставляют "слабо согласованные" данные, что означает, что изменения, происходящие параллельно, могут быть частично видны.
Документация
Please open Telegram to view this post
VIEW IN TELEGRAM
💡 Как избавиться от WebSockets и сэкономить $1 млн в год: неожиданные решения для оптимизации
Как снизить расходы на инфраструктуру и повысить эффективность? Оказывается, отказ от WebSockets может сэкономить миллионы. Вместо привычного подхода можно использовать решения, которые не только проще, но и лучше подходят для определённых задач, как, например, асинхронные очереди или SSE.
Знаете ли вы, как выбрать стратегию, которая одновременно сократит затраты и улучшит масштабируемость? Разберитесь в тонкостях оптимизации и найдите способ выжать максимум из вашей системы. 🚀
🔗 Читать статью
🔗 Зеркало
Как снизить расходы на инфраструктуру и повысить эффективность? Оказывается, отказ от WebSockets может сэкономить миллионы. Вместо привычного подхода можно использовать решения, которые не только проще, но и лучше подходят для определённых задач, как, например, асинхронные очереди или SSE.
Знаете ли вы, как выбрать стратегию, которая одновременно сократит затраты и улучшит масштабируемость? Разберитесь в тонкостях оптимизации и найдите способ выжать максимум из вашей системы. 🚀
🔗 Читать статью
🔗 Зеркало
Forwarded from Книги для джавистов | Java
📚Kubernetes for Developers (2024)
✍️Автор: William Denniss
📃Страниц: 322
Понятное и практичное руководство для начинающих, которое покажет вам, насколько простым может быть переход на Kubernetes!
Что внутри:
🔸Создайте веб-приложение в контейнере с помощью Docker
🔸Разместите контейнерное приложение в Kubernetes с помощью общедоступного облачного сервиса
🔸Сэкономьте деньги и повысьте производительность с помощью облачных технологий
🔸Сделайте свои развертывания надежными и отказоустойчивыми
Ссылка на книгу
✍️Автор: William Denniss
📃Страниц: 322
Понятное и практичное руководство для начинающих, которое покажет вам, насколько простым может быть переход на Kubernetes!
Что внутри:
🔸Создайте веб-приложение в контейнере с помощью Docker
🔸Разместите контейнерное приложение в Kubernetes с помощью общедоступного облачного сервиса
🔸Сэкономьте деньги и повысьте производительность с помощью облачных технологий
🔸Сделайте свои развертывания надежными и отказоустойчивыми
Ссылка на книгу
📜 ТОП-15 международных IT-сертификаций, которые увеличат твой доход в 2025 году
Хочешь знать, какие «корочки» реально поднимут твою зарплату? Исследование Skillsoft раскрыло ТОП-15 самых денежных IT-сертификаций. Спойлер: облака и безопасность рулят.
👉 Читать статью
Хочешь знать, какие «корочки» реально поднимут твою зарплату? Исследование Skillsoft раскрыло ТОП-15 самых денежных IT-сертификаций. Спойлер: облака и безопасность рулят.
👉 Читать статью
Builder — это порождающий паттерн, который позволяет пошагово создавать сложные объекты. Вместо того чтобы создавать объект одним большим конструктором с множеством параметров, Builder организует процесс создания по частям, обеспечивая гибкость и читаемость кода.
Использование:
🔹 Когда нужно создать объект с большим количеством параметров, и не все из них обязательны.
🔹 Когда процесс создания объекта требует выполнения нескольких шагов или дополнительных проверок.
🔹 В случаях, когда один и тот же код должен создавать разные представления объекта (например, текстовое и графическое).
Преимущества:
Недостатки:
📌 Паттерн Builder полезен, если объект имеет много параметров и их нужно задавать гибко. Например, при создании сложных конфигураций для HTTP-запросов (заголовки, тело, параметры), построении графических интерфейсов или генерации HTML-документов. Builder помогает сделать код более понятным и избежать создания конструкций с длинными и неудобными конструкторами.
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Java jobs — вакансии для java-разработчиков
#дайджест #Javadevjob
Вакансии Java разработчиков уровня Junior
▪️ Junior Java Developer
Удалёнка / Офис (Москва, Новосибирск), Динамика
Подробнее
▪️ Backend Developer (JAVA)
Гибрид (Москва), СберЗдоровье
Подробнее
Вакансии Java разработчиков уровня Middle
▪️ Java-разработчик в Систему фрод-мониторинга
Офис (Москва) / Удалёнка, Мир Plat.Form (НСПК)
Подробнее
▪️ Java разработчик (Middle)
Офис (Москва) / Удалёнка, СОГАЗ
Подробнее
Вакансии Java разработчиков уровня Senior
▪️ Java разработчик
Гибрид (Москва) / Удалёнка, СИГМА
Подробнее
▪️ Java/Kotlin Backend Developer
Офис (Москва, Санкт-Петербург) / Удалёнка, Okko
Подробнее
Понравились вакансии?
❤️ — да
🤔 — нет
Вакансии Java разработчиков уровня Junior
▪️ Junior Java Developer
Удалёнка / Офис (Москва, Новосибирск), Динамика
Подробнее
▪️ Backend Developer (JAVA)
Гибрид (Москва), СберЗдоровье
Подробнее
Вакансии Java разработчиков уровня Middle
▪️ Java-разработчик в Систему фрод-мониторинга
Офис (Москва) / Удалёнка, Мир Plat.Form (НСПК)
Подробнее
▪️ Java разработчик (Middle)
Офис (Москва) / Удалёнка, СОГАЗ
Подробнее
Вакансии Java разработчиков уровня Senior
▪️ Java разработчик
Гибрид (Москва) / Удалёнка, СИГМА
Подробнее
▪️ Java/Kotlin Backend Developer
Офис (Москва, Санкт-Петербург) / Удалёнка, Okko
Подробнее
Понравились вакансии?
❤️ — да
🤔 — нет
novosibirsk.hh.ru
Вакансия Junior Java Developer в Новосибирске, работа в компании Динамика (вакансия в архиве c 9 февраля 2025)
Зарплата: от 65000 до 110000 ₽ за месяц. Новосибирск. Требуемый опыт: 1–3 года. Полная занятость. Дата публикации: 06.02.2025.
А вы задумывались, что скрывается под капотом Arrays.sort()? Быстрая сортировка? Пузырёк? Или, может, что-то ещё?
На самом деле, Arrays.sort() – это больше, чем просто сортировка. Этот метод использует адаптивные алгоритмы и оптимизации, которые подстраиваются под тип данных и размер массива. А главное – в его реализации предусмотрена защита от худших случаев, таких как неудачное распределение данных, чтобы всегда обеспечивать стабильную производительность.
Для массивов примитивных типов (int, double и т.д.) используется Dual-Pivot Quicksort. Он выбирает два опорных элемента, которые делят массив на три части: элементы меньше первого опорного, между опорными и больше второго, с последующей рекурсивной сортировкой каждой части.
🔍 Как это выглядит:
if (arr[left] > arr[right]) {
swap(arr, left, right);
}
int pivot1 = arr[left];
int pivot2 = arr[right];
int i = left + 1, lt = left + 1, gt = right - 1;
while (i <= gt) {
if (arr[i] < pivot1) {
swap(arr, i++, lt++); // Элементы меньше первого опорного
} else if (arr[i] > pivot2) {
swap(arr, i, gt--); // Элементы больше второго опорного
} else {
i++; // Элементы между опорными
}
}
swap(arr, left, --lt);
swap(arr, right, ++gt);
- Использование двух опорных элементов снижает глубину рекурсии.
- Разбиение на три части позволяет сбалансировать массив быстрее, чем в классическом Quicksort.
- Работает in-place, избегая лишних выделений.
- Даже на отсортированных или случайных данных Dual-Pivot Quicksort показывает стабильную производительность.
Если вы сортируете объекты (String, Integer и т.д.), то под капотом работает Timsort – гибридный алгоритм, который сочетает Merge Sort и Insertion Sort. Он адаптивно обрабатывает массивы, находя уже отсортированные последовательности (run'ы) и минимизируя количество операций для их слияния.
🔍 Как это выглядит:
int runLen = 32; // Минимальная длина run
for (int i = 0; i < array.length; i += runLen) {
insertionSort(array, i, Math.min((i + runLen - 1), array.length - 1));
}
while (stackSize > 1) {
if (runLen[stackSize - 2] <= runLen[stackSize - 1]) {
mergeRun(stackSize - 2, stackSize - 1); // Слияние соседних run'ов
}
}
- Timsort автоматически находит уже отсортированные подмассивы, уменьшая объём работы.
- Работает с заранее выделенными буферами для быстрого слияния подмассивов.
- Сохраняет порядок равных элементов, что важно для многих задач.
- Производительность близка к O(n) на частично отсортированных данных.
Для массивов с небольшим количеством элементов (до 32) используется Insertion Sort (сортировка вставками). Он работает, проходя по массиву и вставляя каждый элемент на своё место в уже отсортированной части, сдвигая элементы, которые больше текущего, вправо. Этот алгоритм применяется, так как на малых объёмах данных он оказывается быстрее более сложных методов благодаря низким накладным расходам и простоте реализации.
🔍 Как это выглядит:
for (int i = left + 1; i <= right; i++) {
int key = array[i];
int j = i - 1;
while (j >= left && array[j] > key) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = key;
}
- Алгоритм не требует дополнительной памяти и выполняется in-place.
- Сложность O(n^2) на больших данных компенсируется эффективностью на длине до 32 элементов.
- Использует уже загруженные данные в кэше процессора, что ускоряет доступ к памяти.
Please open Telegram to view this post
VIEW IN TELEGRAM
Хочешь узнать, насколько ты прокачан в разработке? Тест для айтишников, чтобы проверить знания. Отличный способ отвлечься и сравнить результаты с друзьями!
👉 Пройти
Please open Telegram to view this post
VIEW IN TELEGRAM
Переход на PostgreSQL — это не просто замена одного инструмента другим. Неправильный подход может привести к потере данных, снижению производительности и длительным простоям. Особенно это касается хранимых процедур: различия между PL/pgSQL и языками, такими как PL/SQL или T-SQL, могут вызывать ошибки, которые сложно обнаружить заранее.
Если вы хотите узнать, как избежать этих проблем, правильно спланировать переход и не потерять производительность, ознакомьтесь с важными советами и готовыми решениями, которые сделают миграцию безопасной и эффективной. 🚀
🔗 Читать статью
🔗 Зеркало
Please open Telegram to view this post
VIEW IN TELEGRAM
Черные скидки на курсы в Академии!
-40% до конца ноября
🔥 В честь Черной пятницы до 30 ноября запускаем распродажу на все курсы proglib.academy и дарим промокод на сумму 10 000 на технику в магазине DigitalRazor (отправим вам по запросу)
🎁 Анонс новогоднего сюрприза!
🎄 Те, кто успеет приобрести курсы с 27 ноября по 27 декабря, получат шанс выиграть крутой новогодний подарок.
Что это будет, пока держим в секрете – следите за новостями на нашем канале!
Почему стоит выбрать нас?
⚫️ Опытные преподаватели
Вас будут обучать доценты ВМК МГУ по математике, а алгоритмы расскажет разработчик из Яндекса и преподаватель МФТИ и НИУ ВШЭ.
⚫️ Бессрочный доступ ко всем курсам
Проходите обучение в удобном для вас темпе, без давления жестких сроков.
⚫️ Поддержка преподавателей
Не останетесь одни — вам всегда помогут разобраться с трудными темами и ответят на любые вопросы через чат и платформу Coreapp.
👉 Не уверены, подойдет ли вам курс? Начните с бесплатных вводных занятий и познакомьтесь с преподавателями и форматом обучения –
Ждем вас на обучении! 🙌
-40% до конца ноября
🔥 В честь Черной пятницы до 30 ноября запускаем распродажу на все курсы proglib.academy и дарим промокод на сумму 10 000 на технику в магазине DigitalRazor (отправим вам по запросу)
🎁 Анонс новогоднего сюрприза!
🎄 Те, кто успеет приобрести курсы с 27 ноября по 27 декабря, получат шанс выиграть крутой новогодний подарок.
Что это будет, пока держим в секрете – следите за новостями на нашем канале!
Почему стоит выбрать нас?
⚫️ Опытные преподаватели
Вас будут обучать доценты ВМК МГУ по математике, а алгоритмы расскажет разработчик из Яндекса и преподаватель МФТИ и НИУ ВШЭ.
⚫️ Бессрочный доступ ко всем курсам
Проходите обучение в удобном для вас темпе, без давления жестких сроков.
⚫️ Поддержка преподавателей
Не останетесь одни — вам всегда помогут разобраться с трудными темами и ответят на любые вопросы через чат и платформу Coreapp.
👉 Не уверены, подойдет ли вам курс? Начните с бесплатных вводных занятий и познакомьтесь с преподавателями и форматом обучения –
Ждем вас на обучении! 🙌
Если вы работаете с PostgreSQL в условиях высокой нагрузки или больших объемов данных, оптимизация становится ключевым элементом успеха.
Вот несколько советов, которые помогут повысить производительность вашей базы данных:
👉 Переходите по ссылке
Please open Telegram to view this post
VIEW IN TELEGRAM
🔒 Pessimistic vs Optimistic Locking
🔵 Pessimistic Locking
- Запись недоступна для других потоков до тех пор, пока текущий поток не закончит работу с ней.
- Даже чтение данных другими потоками невозможно, пока лок не снят.
- Пример: EntityManager.lock(entity, LockModeType.PESSIMISTIC_WRITE) в JPA.
- Минусы: снижает производительность при высоком уровне конкурентного доступа.
- Когда применять: при критической необходимости точности данных.
🔵 Optimistic Locking
- Не блокирует данные при чтении, но проверяет версию записи при сохранении.
- Пример: аннотация @Version в JPA (колонка для хранения версии).
- Если версия изменена другим потоком, выбрасывается OptimisticLockException.
- Минусы: требует обработки конфликтов.
- Когда применять: при большом количестве чтений и низкой вероятности конфликтов.
💬 Какой подход вы чаще используете в своих проектах?
- Запись недоступна для других потоков до тех пор, пока текущий поток не закончит работу с ней.
- Даже чтение данных другими потоками невозможно, пока лок не снят.
- Пример: EntityManager.lock(entity, LockModeType.PESSIMISTIC_WRITE) в JPA.
- Минусы: снижает производительность при высоком уровне конкурентного доступа.
- Когда применять: при критической необходимости точности данных.
- Не блокирует данные при чтении, но проверяет версию записи при сохранении.
- Пример: аннотация @Version в JPA (колонка для хранения версии).
- Если версия изменена другим потоком, выбрасывается OptimisticLockException.
- Минусы: требует обработки конфликтов.
- Когда применять: при большом количестве чтений и низкой вероятности конфликтов.
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉 Розыгрыш от Proglib Academy и DigitalRazor!
С 27 ноября по 27 декабря у вас есть шанс не только прокачать свои навыки, но и выиграть ПК при покупке любого курса Академии!
🎁 Призы для участников акции:
– Игровой ПК DigitalRazor ProGaming
– VIP-пакет курса Proglib Academy
💡 Как принять участие?
Купите любой курс Proglib Academy с 27 ноября по 27 декабря и получите шанс выиграть мощный ПК.
Приобретите технику DigitalRazor — участвуйте в розыгрыше VIP курса.
📅 Вместе с DigitalRazor мы создали спецпредложение -50% на курсы до 30 ноября, чтобы вы могли начать обучение на более выгодных условиях.
Выбрать курс
С 27 ноября по 27 декабря у вас есть шанс не только прокачать свои навыки, но и выиграть ПК при покупке любого курса Академии!
🎁 Призы для участников акции:
– Игровой ПК DigitalRazor ProGaming
– VIP-пакет курса Proglib Academy
💡 Как принять участие?
Купите любой курс Proglib Academy с 27 ноября по 27 декабря и получите шанс выиграть мощный ПК.
Приобретите технику DigitalRazor — участвуйте в розыгрыше VIP курса.
📅 Вместе с DigitalRazor мы создали спецпредложение -50% на курсы до 30 ноября, чтобы вы могли начать обучение на более выгодных условиях.
Выбрать курс
Forwarded from Библиотека Go-разработчика | Golang
This media is not supported in your browser
VIEW IN TELEGRAM
⚡️ Напоминаем: у нас можно (и нужно) купить рекламу
→ Более 60 телеграм-каналов по всем направлениям IT
→ Почти 1,2 миллиона аудитории
→ Собственное медиа и сайт с DAU 25 000 — можем усилить продвижение
→ Классные email-рассылки
→ И, конечно же, крутые контент-менеджеры, которые сделают нативную интеграцию/придумают виральный пост/реализуют любые контентные предпочтения
Для заказа пишите сюда: @proglib_adv
→ Более 60 телеграм-каналов по всем направлениям IT
→ Почти 1,2 миллиона аудитории
→ Собственное медиа и сайт с DAU 25 000 — можем усилить продвижение
→ Классные email-рассылки
→ И, конечно же, крутые контент-менеджеры, которые сделают нативную интеграцию/придумают виральный пост/реализуют любые контентные предпочтения
Для заказа пишите сюда: @proglib_adv
🏢📊 Как сократить расходы на инфраструктуру в 20 раз: опыт внедрения мультитенантной архитектуры
Снизить затраты на инфраструктуру в десятки раз — не фантастика, а реальность. Мультитенантная архитектура помогает не только экономить деньги, но и упрощает подключение новых клиентов, масштабирование и обслуживание системы. Такой подход значительно облегчает работу и открывает новые возможности для роста.
Хотите узнать, как правильно её внедрить, избежать типичных ошибок и достичь впечатляющих результатов? Ознакомьтесь с реальным опытом, который вдохновит на изменения.🍹
🔗 Читать статью
🔗 Зеркало
Снизить затраты на инфраструктуру в десятки раз — не фантастика, а реальность. Мультитенантная архитектура помогает не только экономить деньги, но и упрощает подключение новых клиентов, масштабирование и обслуживание системы. Такой подход значительно облегчает работу и открывает новые возможности для роста.
Хотите узнать, как правильно её внедрить, избежать типичных ошибок и достичь впечатляющих результатов? Ознакомьтесь с реальным опытом, который вдохновит на изменения.
🔗 Читать статью
🔗 Зеркало
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔🔥🪦 Беспощадный Frontend-тест: уволься сам, если не наберешь 7 из 10!
Эй! Среди нас есть Java-разработчики, которые считают себя фулстеком? Или те, кто хоть раз открывал HTML и CSS? Кто тут настоящий универсал, а кто только на бэк готов.
👉 Проверяем тут.
Эй! Среди нас есть Java-разработчики, которые считают себя фулстеком? Или те, кто хоть раз открывал HTML и CSS? Кто тут настоящий универсал, а кто только на бэк готов.
👉 Проверяем тут.