Как сделать объект Singleton-Scoped потокобезопасным (Guice + Owasp ESAPI)

В настоящее время я использую Owasp ESAPI для управления аутентификацией в своем веб-приложении Java и внедряю Singleton MyAuthenticator с помощью guice.injectMembers(this). Я хотел бы отойти от этого подхода и использовать созданный guice объект Singleton-Scoped. Мне понравилась потокобезопасность синглтона ESAPI и безопасность синглетонов в целом с использованием Double-Checked Locking, IODH Idiom или стиля Enum INSTANCE Блоха.

Что мне нужно сделать с моим Guicified Singleton-Scoped Authenticator, чтобы сделать его потокобезопасным, а также с полем ThreadLocal, которое я использую для получения и установки моего текущего пользователя?

Я хотел бы, чтобы все приложение работало с внедрением зависимостей, но не хочу, чтобы оно ломалось при одновременном доступе к веб-приложению. Есть предложения или распространенные ошибки?

Используемый мной объект ThreadLocal выглядит следующим образом:

private final ThreadLocalUser currentUser = new ThreadLocalUser();

private class ThreadLocalUser extends InheritableThreadLocal<User> {

    @Override
    public User initialValue() {
        return User.ANONYMOUS;
    }

    public User getUser() {
        return super.get();
    }

    public void setUser(User newUser) {
        super.set(newUser);
    }
}

person oberger    schedule 15.02.2012    source источник


Ответы (2)


К сожалению, я недостаточно знаю об Owasp ESAPI, чтобы дать конкретный ответ, но вам может повезти, если вы посмотрите на поддержку AOP в Guice. Вы можете перехватывать все вызовы методов в классе и обеспечивать любое поведение параллелизма, которое вам нравится.

http://code.google.com/p/google-guice/wiki/AOP

person idle    schedule 21.02.2012

Остерегайтесь использования шаблона «Двойная проверка блокировки» в Java. Этот шаблон проектирования ненадежно работает в Java (например, см. http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html) если вы не объявите экземпляр синглтона как "volatile" .

person Kevin W. Wall    schedule 09.02.2013