On Wed, Jan 14, 2009 at 10:04 PM, Dhanji R. Prasanna <[email protected]>wrote:

>
>  It's not the enum that's the problem, it's the lazy creation of the
> injector:
>
>  private Injector getInjector() {
>     if (injector == null) {
>       injector = Guice.createInjector(getModules());
>     }
>     return injector;
>   }
>
> This can lead to multiple injectors being created concurrently, and worse:
> to partially created injectors being visible from other threads.
>
>
>

In my case that I posted as an enum I wasn't actually doing the above null
check and was initializing it right away on one line which I thought was
safe since everything I seem to be reading (but I'm still looking) seems to
at least imply that in a multi-threaded environment any instance
declarations in the enum wouldn't be hit so that it's safe in an enum to do:

public enum ServiceFactory {
    INSTANCE;

    Injector injector = Guice.createInjector(getModules());

    public <T> T getService(Class<T> clz) {
        return injector.getInstance(clz);
    }

    private Collection<Module> getModules() {
        //
        return modules;
    }

}

Wouldn't all the instance initializers fire before any other thread had
access to the enum?

similar to how (from what I rember) an eagerly loaded singleton with statics
is thread-safe as well...?

private static final Foo instance = new Foo();
    private Foo() {}
    public static Foo getInstance() {
        return instance;
    }

So it's wrong to assume that both of these are thread-safe?

-- 
Rick

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"google-guice" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/google-guice?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to