3

アプリの作成中。アーキテクチャ 私は、以下で説明する 1 つの構造の必要性に直面しました。

同じ機能を持つよく知られたデザイン パターンがあることは確かです。なぜなら、私がそれを開発した問題は非常に一般的だと思うからです。

私はこれの独自の実装を書いていますが、私は常にパターンの「ビルドイン言語」実装を使用しようとしているので、この構造に名前を付けるのを手伝ってください。

アイデアはリーダーライターのパターンに近いです。キー()でオブジェクトを追加できる「コンテナ」があります。また、このオブジェクトをキーで取得して、コンテナーから削除することもできます。

したがって、実装されたクラスには 2 つのメソッドが必要です。

void putObject(Key key, Object object);
Object getObject(Key key); // remove <Key,Object> from container.

次が一番面白い。 このコンテナーは、次のようにマルチスレッド環境で動作する必要があります

  1. key に関連付けられたオブジェクトがない場合、get(Key key) メソッドを呼び出している間、呼び出し元スレッドはこのコンテナー内のオブジェクトを待機する必要があります。
  2. 別のスレッドが putObject(Key key, Object object) メソッドを呼び出す場合、このオブジェクトを正確に待機するスレッドがあるかどうかを確認し、存在する場合は、待機しているスレッドにシグナルを送信してウェイクアップします。

一般的な構造だと思いますが、「正式な」名称はありますか?

このパターンの私の Java 実装:

private static interface BlackBox {

        public void addObject(IdObject object);

        public IdObject getObject(ObjectId id);

    }

    private static class BlackBoxImpl implements BlackBox {

        private final Lock conditionLock = new ReentrantLock();
        private final Map<ObjectId, IdObject> savedObjects;
        private final Map<ObjectId, Condition> waitingConditions;

        public BlackBoxImpl() {
            this.savedObjects = new ConcurrentHashMap<ObjectId, IdObject>(20);
            this.waitingConditions = new ConcurrentHashMap<ObjectId, Condition>(20);
        }

        @Override
        public void addObject(IdObject object) {
            savedObjects.put(object.getId(), object);
            if (waitingConditions.containsKey(object.getId())) {
                Condition waitCondition = waitingConditions.get(object.getId());
                conditionLock.lock();
                waitCondition.signal();
                conditionLock.unlock();
            }
        }

        @Override
        public IdObject getObject(ObjectId id) {
            if (savedObjects.containsKey(id)) {
                return savedObjects.get(id);
            } else {
                conditionLock.lock();
                Condition waitCondition = conditionLock.newCondition();
                waitingConditions.put(id, waitCondition);
                waitCondition.awaitUninterruptibly();
                conditionLock.unlock();
                return savedObjects.get(id);
            }
        }

    }

    private static interface IdObject {

        public ObjectId getId();

    }

    private static class IdObjectImpl implements IdObject {

        protected final ObjectId id;

        public IdObjectImpl(ObjectId id) {
            this.id = id;
        }

        @Override
        public ObjectId getId() {
            return id;
        }

    }

    private static interface ObjectId {

    }

    private static class ObjectIdImpl implements ObjectId {

    }
4

2 に答える 2

1

あなたのデザインを見て、私にはあなたが何を説明しているのか

キー()でオブジェクトを追加できる「コンテナ」があります。また、このオブジェクトをキーで取得して、コンテナーから削除することもできます。このコンテナはマルチスレッド環境で動作するはずです

並行オブジェクト プールに近いです。すぐに使用できる初期化されたオブジェクトのセットを使用します。プールのクライアントは、プールからオブジェクトを要求し、返されたオブジェクトに対して操作を実行します。

私が見る唯一の本当の違いは、独自の基準に基づいてオブジェクトを取得していることです。

于 2016-03-27T19:30:47.507 に答える