english | блог | контакт
Thu, 01 Jul 2010 @ 10:03

Синглтоны и синхронизация в 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

Sat, 12 Jun 2010 @ 08:12

Инициализация объектов

java

Вспомнил, что в прошлом году очень хотел сертифицироваться. По этому поводу открыл гайд к SCJP от Sybex и уже несколько дней вдумчиво читаю.

Вот вроде бы простая тема, повсеместно используемая, инициализация объектов, но и в ней есть свои заморочки.
читать дальше

Tue, 08 Jun 2010 @ 06:51

Запуск программы и 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!

Mon, 07 Jun 2010 @ 14:58

Spring, ApplicationEventPublisher и ApplicationListener

java spring

Какое-то время меня волновал вопрос: как работают события в Spring?
Понятное дело, приложение через ApplicationEventPublisher.publishEvent(...) их публикует, а различные реализации ApplicationListener.onApplicationEvent(...) эти события получают и обрабатывают.

Но меня волновал вопрос: что если события поступают быстрее, чем обрабатываются?

Сегодня методом "научного тыка" было выяснено, что publishEvent() не возвращает управление до тех пор, пока событие не обработано.

Дальше код:
читать дальше

Wed, 26 May 2010 @ 09:35

Семафоры и велосипеды

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) { ... }
}

Далее реализация.
читать дальше

Thu, 01 Apr 2010 @ 15:47

JPA и составной PrimaryKey

hibernate java jpa

Возникла такая странная ситуация: понадобилось работать с таблицей сущностей, которым не нужен отдельный ID (а JPA очень хочет работать с сущностями, имеющими ID). В принципе, сущности уникальны и можно сделать ключ по всем полям, но "просто и в лоб" проблема не решалась. Сложность была в том, что часть композитного ключа являлась ссылкой по ForeignKey к другой сущности.

Выглядела сущность, подлежащая хранению, приблизительно так:

public class WhoisEntity {
  private long ipLow;
  private long ipHigh;
  private Location loc; // у класса Location есть свойство "id"
  // геттеры и сеттеры
}

читать дальше

Wed, 24 Mar 2010 @ 12:01

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>

Mon, 15 Mar 2010 @ 14:50

Конфигурирование 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.

Thu, 18 Feb 2010 @ 15:34

Маршализация атрибутов в CXF (jax-ws)

java web-сервисы

Забавный эффект: если метод возвращает некий пользовательский тип, в результирующем XML будут только те атрибуты, у которых имеются как геттеры, так и сеттеры (то есть нужно полное соответствие JavaBeans). Иначе придётся аннотировать интересующие методы как @XmlAttribute.

Ещё можно для всего класса дополнительно указать @XmlAccessorType(XmlAccessType.FIELD) и работать будет с полями напрямую.

Но в большинстве случаев проще дополнить недостающими методами и не напрягаться по поводу дополнительных аннотаций.
читать дальше

Fri, 12 Feb 2010 @ 12:03

Преобразования ip и netmask

java алгоритмы велосипеды

Чисто из любопытства получился очередной велосипед, умеющий преобразовывать адрес ip в int и обратно в строку + калькулятор маски сети для двух крайних адресов.
читать дальше

Страницы: 1 2 3 4