2

に示すように、このコードを以下に示します。私たちのアプリケーションは、ロード バランサーによって制御される 5 つの Web サーバーで実行され、すべてが 1 つの Memcache インスタンスに接続されています。

この同期は 1 つの Instance に対してのみ機能すると思います。

5 つの Web サーバーが Memcache にアクセスしようとしているときに、このコードを同期する方法を教えてください。

public class Memcache {
    private MemcachedClient memclient = null;  
    private static Memcache instance = null;

    public static Memcache getInstance() {
        if (instance == null) {
            try {
                synchronized (Memcache.class) {
                    instance = new Memcache();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        return instance;
    }

    private Memcache() throws IOException {
        MemcachedClientBuilder builder = new XMemcachedClientBuilder();
        memclient = builder.build();

    }

}
4

2 に答える 2

6

このように初期化してみませんか?

private static Memcache instance = new Memcache();

ここでの同期で達成しようとしたことには問題があることに注意してください
。2つのスレッドが(if(instance == null)(コンテキストスイッチはその行の後にある可能性があります)を通過する可能性があるため、ダブルチェックパターン
検討できます 。一部のバージョンのJavaには問題があります。 私が提供したリンクには、問題に関する情報があります。このリンク では、volatileキーワードを使用してシングルトンについて読むことができます。



私はまだ私が上で提案したオプションを選びます。

于 2012-11-01T07:07:58.733 に答える
0

遅延初期化されたClassHolderパターンを使用して、クラスへの同期アクセスを実装できます。Memcacheは静的初期化子で初期化されるため、これ以上の同期構造は必要ありません。任意のスレッドによるgetInstance()の最初の呼び出しにより、MemcacheHolderがロードおよび初期化され、Memcacheインスタンスが呼び出し元のコードで使用できるようになります。

public class MemcacheFactory{

  private static class MemcacheHolder {
        public static Memcache instance = new Memcache();
    }

    public static Memcache getInstance() {
        return MemcacheFactory.MemcacheHolder.instance;
    }

}
于 2012-11-01T08:18:11.743 に答える