2

Singleton クラスと同様に、クラスの最大 5 つのインスタンスを作成できる Fiveton クラスを作成したいと考えています。さまざまなスレッドがこのクラスのインスタンスにアクセスしようとしています (したがって、getInstance メソッドを提供する必要があります)。ただし、クラスは重いため、インスタンスを積極的に作成しないでください。つまり、オンデマンドで作成してください。

また、スレッドはラウンド ロビン方式でインスタンスが割り当てられるという契約もあります。つまり、スレッド 1、6、11 は Fiveton オブジェクトのインスタンス 1 を取得します。インスタンスがスレッドによって使用されている場合、それらはロックを待機します (スレッド 6 と 11 がインスタンス 1 を待機し、スレッド 11 がそれ​​を取得する可能性がありますが、スレッド 11 がインスタンス 2 を取得することはありません)。同様に、スレッド番号。2、7、12 はインスタンス 2 を取得する必要があります。

4

3 に答える 3

3

クラス自体でそれをコーディングしないでください*。代わりに、オブジェクトプールを使用してください。

開始するのに適したライブラリはApache Commons / Poolです

私にはわかりませんが、より高速であると主張する別のものは激怒オブジェクトプールです

提供された実装の 1 つを使用するか、ライブラリをベースとして使用して、独自のカスタム プールを構築します。

* それをクラス自体にコーディングしてみませんか? クラスの機能とクラスのインスタンスへのアクセス方法は、無関係な問題だからです。クラスは、それ自体を管理することではなく、その中心的な目的に集中する必要があります。

于 2013-04-10T08:16:25.387 に答える
1

インスタンスの作成中の競合が気になる場合 (つまり、スレッド 2 がまだインスタンスを作成しているため、スレッド 6 をブロックしたくない場合)、ロック ストライピング戦略を使用できます。この実装では、スレッド 1、2 が想定されています。 、 ...getInstance次々に呼び出します。

class CyclicFiveton {

    private static final CyclicFiveton[] fivetons = new CyclicFiveton[5];
    private static final Object[] locks = new Object[5];
    private static final AtomicInteger counter = new AtomicInteger();

    static {
        for (int i = 0; i < 5; i++) {
            locks[i] = new Object();
        }
    }

    private CyclicFiveton() {
    }

    public static CyclicFiveton getInstance() {
        int index = counter.getAndIncrement() % 5;
        synchronized (locks[index]) {
            CyclicFiveton fiveton = fivetons[index];
            if (fiveton == null) {
                fiveton = new CyclicFiveton();
                fivetons[index] = fiveton;
            }
            return fiveton;
        }
    }
}
于 2013-04-10T14:19:07.653 に答える