9

Guice について懸念があり、そのシングルトンがスレッドの制限に従うかどうかについて、私が設定しようとしている可能性があります。

public class CacheModule extends AbstractModule {
    @Override
    protected void configure() {
        // WidgetCache.class is located inside a 3rd party JAR that I
        // don't have the ability to modify.
        WidgetCache widgetCache = new WidgetCache(...lots of params);

        // Guice will reuse the same WidgetCache instance over and over across
        // multiple calls to Injector#getInstance(WidgetCache.class);
        bind(WidgetCache.class).toInstance(widgetCache);
    }
}

// CacheAdaptor is the "root" of my dependency tree. All other objects
// are created from it.
public class CacheAdaptor {
    private CacheModule bootstrapper = new CacheModule();

    private WidgetCache widgetCache;

    public CacheAdaptor() {
        super();

        Injector injector = Guice.createInjector(bootstrapper);

        setWidgetCache(injector.getInstance(WidgetCache.class));
    }

    // ...etc.
}

ご覧のとおり、 の新しいインスタンスを作成するたびに、CacheAdaptorそのCacheModule下にある依存関係ツリー全体をブートストラップするために が使用されます。

new CacheAdaptor();複数のスレッド内から呼び出された場合はどうなりますか?

CacheAdaptor例: スレッド #1 は引数なしのコンストラクターを介してnew を作成し、スレッド #2 は同じことを行います。Guice は各スレッドのにまったく同じインスタンスを提供しますか、それとも Guice は各スレッドに 2 つの異なるインスタンスを提供しますか? WidgetCacheCacheAdaptor同じシングルトン インスタンスを返すことになっていtoInstance(...)ますが、モジュールは 2 つの異なるスレッド内で作成されるため、それぞれが異なるインスタンスCacheAdaptorを受け取ることを期待しています。WidgetCache

前もって感謝します!

4

1 に答える 1