3

次の API を実現する良い方法を見つけようとしています。

void add(Object o);
void processAndClear();

クラスはオブジェクトを保存し、processAndClear を呼び出すと、現在保存されているオブジェクトを繰り返し処理し、何らかの方法で処理してから、ストアをクリアします。このクラスはスレッドセーフである必要があります。

明らかなアプローチはロックを使用することですが、私はもっと「並行」したかったのです。これは私が使用するアプローチです:

class Store{
    private AtomicReference<CopyOnWriteArrayList<Object>> store = new AtomicReference<>(new CopyOnWriteArrayList <>());

    void add(Object o){
        store.get().add(o);
    }

    void processAndClear(){
        CopyOnWriteArrayList<Object> objects = store.get();
        store.compareAndSet(objects, new CopyOnWriteArrayList<>());
        for (Object object : objects) {
            //do sth
        }
    }
}

これにより、オブジェクトを追加しようとするスレッドは、xlearing の完了をロックしたり待機したりすることなく、ほぼ即座に続行できます。これは多かれ少なかれ正しいアプローチですか?

4

2 に答える 2

1

クラスはオブジェクトを保存し、processAndClear を呼び出すと、現在保存されているオブジェクトを繰り返し処理し、何らかの方法で処理してから、ストアをクリアします。

BlockingQueueこれは、このタスクにa を使用する必要があるようです。メソッドadd(...)がキューに追加され、コンシューマーがtake()次のアイテムを待機しているブロックを呼び出します。(は典型的な実装ですBlockingQueue)ArrayBlockingQueueは、すべての同期とシグナリングを処理します。

CopyOnWriteArrayListこれは、も も持つ必要がないことを意味しますAtomicReference。失われるのはコレクションであり、投稿が現在明確にしている以外の理由で反復できます。

于 2014-03-05T15:20:53.843 に答える