次の 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 の完了をロックしたり待機したりすることなく、ほぼ即座に続行できます。これは多かれ少なかれ正しいアプローチですか?