Синглтоны и синхронизация в Java
java singleton
Во всём бывают плюсы и минусы. Минус - не знал, плюс - теперь покопался и буду знать.
Знал, что работа с синглтоном в нагруженной многопоточной/многопроцессорной среде не тривиальна. Но думал, что вариант с двойной проверкой достаточно хорош.
Вышло, что лучший вариант - статический инициализатор. Вариант с двойной проверкой тоже достоин жизни после добавления модификатора volatile ("просто добавь воды :)"):
public class Singleton { private volatile static Singleton singleton; public static synchronized Singleton getInstance() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) singleton = new Singleton(); } } return singleton; } }
Статья с Хабра о синглтонах в java:
http://habrahabr.ru/blogs/complete_code/27108/
Хорошая статья на английском, с обзором вариантов реализации:
http://avricot.com/blog/index.php?post/2010/05/11/Java-MultiThread-singleton-LocalThread-vs-Double-Check-Locked-(dcl)-vs-synchronized-vs-static
Англоязычное разъяснение "почему двойная проверка плоха":
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
Инициализация объектов
java
Вспомнил, что в прошлом году очень хотел сертифицироваться. По этому поводу открыл гайд к SCJP от Sybex и уже несколько дней вдумчиво читаю.
Вот вроде бы простая тема, повсеместно используемая, инициализация объектов, но и в ней есть свои заморочки.
читать дальше
Запуск программы и main(...)
java
А ведь это корректно работает:
public class StaticTest { static { main(); } static void main() { System.out.println("hello, world!"); System.exit(0); } }
Вывод:
~$ javac StaticTest.java && java StaticTest hello, world!
Spring, ApplicationEventPublisher и ApplicationListener
java spring
Какое-то время меня волновал вопрос: как работают события в Spring?
Понятное дело, приложение через ApplicationEventPublisher.publishEvent(...) их публикует, а различные реализации ApplicationListener.onApplicationEvent(...) эти события получают и обрабатывают.
Но меня волновал вопрос: что если события поступают быстрее, чем обрабатываются?
Сегодня методом "научного тыка" было выяснено, что publishEvent() не возвращает управление до тех пор, пока событие не обработано.
Дальше код:
читать дальше
Семафоры и велосипеды
concurrency java
Сделал очередной велосипед: именованный семафор. Для моей задачи, как мне показалось, это был более удобный вариант.
Вкратце:
public class SemaphoreUtils { public static boolean enterLock(String name, int workers) { ... } public static boolean enterLock(String name, int workers, long waitMillis) { ... } public static void leaveLock(String name) { ... } }
Далее реализация.
читать дальше
JPA и составной PrimaryKey
hibernate java jpa
Возникла такая странная ситуация: понадобилось работать с таблицей сущностей, которым не нужен отдельный ID (а JPA очень хочет работать с сущностями, имеющими ID). В принципе, сущности уникальны и можно сделать ключ по всем полям, но "просто и в лоб" проблема не решалась. Сложность была в том, что часть композитного ключа являлась ссылкой по ForeignKey к другой сущности.
Выглядела сущность, подлежащая хранению, приблизительно так:
public class WhoisEntity { private long ipLow; private long ipHigh; private Location loc; // у класса Location есть свойство "id" // геттеры и сеттеры }
читать дальше
Ehcache автоапдейт
ehcache hibernate java
Сегодня в логах заметил замечательную строчку:
INFO - UpdateChecker - New update(s) found: 2.0.0 [http://ehcache.org/news.html]
"Я негодую", в серверном окружении, по-умолчанию, какая-то библиотека (да, вполне определённая) лезет куда-то в сеть и чекает свои апдейты.
Чую, скоро в логи будет падать реклама "посетите нашего спонсора, увеличьте сами-знаете-что :)"...
Кроме проверки апдейтов на хост отправляется статистика использования ehcache (версии os, jvm, платформа, продукт).
Отключается эта пакость в java-properties "-Dnet.sf.ehcache.skipUpdateCheck=true", либо в конфиге, ehcache.xml:
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false"> <!-- здесь, собственно, основной конфиг --> </ehcache>
Конфигурирование Acegi [2]
acegi java spring авторизация
Начиная с версии 2.0 (да, сейчас уже есть 3-я версия) в Spring-е начали активно использовать неймспейсы. К сожалению, все исходники, с которыми мне пришлось работать, были написаны с использованием spring 1.2 и о неймспейсах, как и о прочих плюшках, приходится узнавать самостоятельно.
Ранее я собрал шаблонный конфиг, который предполагал использовать в будущем. Вообще, понимание того, как оно работает "изнутри", за шторкой неймспейсов - хорошо. Но вместо полотна на 2-3 страницы вполне можно использовать такой код:
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.4.xsd"> <http auto-config='true'> <intercept-url pattern="/anon/*" filters="none"/> <intercept-url pattern="/**" access="ROLE_ADMIN" /> <form-login login-page="/anon/login.jsp"/> </http> <authentication-provider> <user-service> <user name="admin" password="123" authorities="ROLE_ADMIN" /> </user-service> </authentication-provider> </beans:beans>
В данном случае меньше = лучше :)
Читаю Spring Secutiry reference.
Маршализация атрибутов в CXF (jax-ws)
java web-сервисы
Забавный эффект: если метод возвращает некий пользовательский тип, в результирующем XML будут только те атрибуты, у которых имеются как геттеры, так и сеттеры (то есть нужно полное соответствие JavaBeans). Иначе придётся аннотировать интересующие методы как @XmlAttribute.
Ещё можно для всего класса дополнительно указать @XmlAccessorType(XmlAccessType.FIELD) и работать будет с полями напрямую.
Но в большинстве случаев проще дополнить недостающими методами и не напрягаться по поводу дополнительных аннотаций.
читать дальше
Преобразования ip и netmask
java алгоритмы велосипеды
Чисто из любопытства получился очередной велосипед, умеющий преобразовывать адрес ip в int и обратно в строку + калькулятор маски сети для двух крайних адресов.
читать дальше