Нюансы Java разработки

Блог о Java разработке и в деталях описывает наиболее интересные темы


Все что вы хотели знать о Singleton

Шаблон проектирования Singleton (Одиночка) один из самых некорректно применяемых паттернов. В этой статье мы рассмотрим несколько реализаций синглтона, которые работают корректно в многопоточной среде, при выполнении задач сериализции и клонирования и даже при рефлексивных атаках.

Оглавление ✓Для чего используется singleton ✓Отличия от статических классов ✓Lazy или eager загрузка singleton? ✓Eager loading singleton ✓Грубая синхронизация ✓Double-checked locking синглтон ✓Initialization-on-demand holder идиома ✓Основанный на enum singleton ✓Проблемы с сериализацией и десериализацией ✓Проблемы с клонированием ✓Проблемы с рефлексией ✓Итак, почему синглтон может считаться анти-паттерном? ✓Заключение Для чего используется singleton Паттерн singleton используется в случаях когда существовать может ровно один экземпляр класса и он должен быть доступен через хорошо известную точку доступа или когда единственный экземпляр должен быть расширяем подклассами и клиенты должны иметь возможность использовать наследуемый экземпляр без модификации своего кода. Отличия от статических классов В JDK есть примеры использования и синглтонов и статических классов, с одной стороны java.lang.Math – final класс со статическими методами, с другой стороны java.lang.Runtime – синглтон. Преимущества singleton ✓Если вам требуется поддерживать состояние, то синглтон больше подходит, нежели статический класс, поскольку поддержка состояния в статических классах может привести к ошибкам, особенно в конкурентном окружении, что может приводить к состоянию гонки без адекватной синхронизации параллельных модификаций различными потоками. ✓Синглтон класс может быть «лениво» загружен, если это тяжелый объект, но у статического класса нет таких преимуществ и он всегда сразу загружается. ✓С синглтоном вы можете использовать наследование и полиморфизм для расширения базового класса, реализовать интерфейс и предоставлять различные реализации. ✓Поскольку с... Читать далее

Ноябрь 2019
3  

SynchronousQueue или TransferQueue

В Java 7 появился новый интерфейс TransferQueue в добавлении к уже существующему со времен Java 5 SynchronousQueue. Возникает резонный вопрос — для чего?

Оглавление ✓Для начала о TransferQueue ✓Пара слов о SynchronousQueue ✓SynchronousQueue vs TransferQueue Для начала о TransferQueue В Java 7 появился новый интерфейс TransferQueue и соответствующая реализация LinkedTransferQueue. TransferQueue расширяет BlockingQueue, который в свою очередь расширяет Queue интерфейс, добавленный в Java 5. BlockingQueue — это очередь, которая может блокировать и потоки Поставщиков (Producer) при добавлении элементов в переполненную очередь, и потоки Потребителей (Consumer), при извлечении из пустой очереди. Основная задача блокирующих очередей — справляться с наплывом данных, которые система не в состоянии обработать за приемлемое время. TransferQueue развивает эту идею и идет дальше, блокируя поток Поставщика до тех пор, пока элемент не будет извлечен потоком Потребителя. Ключевой метод — transfer — блокировка происходит до тех пор, пока элемент не перейдет от одного потока к другому. Существуют дополнительные методы — две формы передачи элементов tryTransfer — либо блокирующая с таймаутом, либо неблокирующая, но осуществляющая передачу только при наличии ожидающего Потребителя. Так же существует пара вспомогательных методов hasWaitingConsumer и getWaitingConsumerCount. Пара слов о SynchronousQueue Все мы помним о SynchronousQueue, который появился ранее в Java 5, предоставляет очередь размеров в 0 элементов и который так хорошо подходит для передачи элементов между потоками. Эта очередь работает по принципу «один вошел — один вышел». Каждая операция вставки блокирует поток Поставщика до тех пор, пока поток Потребителя не получит элемент из очереди и наоборот, Потребитель будет ждать пока Поставщик не вставит элеме... Читать далее


Как использовать ConcurrentHashMap в Java

До Java 1.5, если вам нужна была реализация Map, которую можно безопасно использовать в многопоточной Java-программе, у вас были только Hashtable или synchronized Map, потому что HashMap НЕ безопасен.

Оглавление ✓Введение ✓Как реализован ConcurrentHashMap в Java ✓Некоторые важные свойства ConcurrentHashMap ✓Когда следует использовать ConcurrentHashMap в Java Введение ConcurrentHashMap был представлен как альтернатива Hashtable в Java 1.5 как часть пакета многопоточности. C ConcurrentHashMap у вас есть лучший выбор, не только потому, что это безопасно в многопоточном окружении, но так же предоставляет лучшую производительность по сравнению с Hashtable и synchronizedMap. ConcurrentHashMap работает производительнее, потому что блокирует лишь часть Map. Позволяет одновременные операции чтения и в тоже время обеспечивает целостность, синхронизируя операции записи. Как реализован ConcurrentHashMap в Java ConcurrentHashMap был разработан как альтернатива Hashtable и обеспечивает всю функциональность, предоставляемой Hashtable, с дополнительными возможностями, называемые уровень одновременности (concurrency level). ConcurrentHashMap позволяет множеству читателей одновременное чтение без использования блокировок. Это достигается разделением Map на различные части, основываясь на «уровне одновременности» и блокированием только части Map при обновлении. По умолчанию, уровень одновременности равен 16, и соответственно Map разделяется на 16 частей и каждая часть управляется отдельной блокировкой. Это означает, что 16 потоков могут работать с Map одновременно, пока они работают с разными частями Map. Это делает ConcurrentHashMap высокопроизводительным, в тоже время не ухудшая потоко-безопасность. Некоторые важные свойства ConcurrentHashMap Но существует особенности. Поскольку операции обновления не синхронизирующие, одновременная выборка данных может ... Читать далее