如何使Singleton-Scoped对象线程安全(Guice + Owasp ESAPI)

时间:2012-02-15 22:24:37

标签: java dependency-injection thread-safety guice esapi

我目前正在使用Owasp ESAPI来管理我的java Web应用程序中的身份验证,我正在使用guice.injectMembers(this)注入Singleton MyAuthenticator。我想离开这种方法并使用guice创建的Singleton-Scoped对象。我喜欢ESAPI单身人士的线程安全,以及一般的单身人士的安全,使用Double-Checked Locking,IODH Idiom或Bloch的Enum INSTANCE风格。

我需要对Guicified Singleton-Scoped Authenticator做什么才能使其成为线程安全的,以及我用来获取和设置当前用户的ThreadLocal字段?

我想使整个应用程序与依赖注入一起工作,但不希望它破坏web-app并发访问。有任何建议或常见的陷阱吗?

我使用的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);
    }
}

2 个答案:

答案 0 :(得分:0)

不幸的是,我不太了解Owasp ESAPI给出的具体答案,但是你可能会对Guice的AOP支持有所了解。您可以拦截类上的所有方法调用,并提供您喜欢的任何并发行为。

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

答案 1 :(得分:0)

请注意在Java中使用“Double-Check Locking”模式。此设计模式在Java中无法可靠地工作(例如,请参阅http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html,除非您将单例实例声明为“ volatile ”。