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
-~----------~----~----~----~------~----~------~--~---