私は(名前が類推の目的のために不自然です)私は、次の動作を実装できることを使用する1つ以上の同時コレクションを見つけようとしている:のjava:同時コレクション
/**
* Acts as a broker for a concurrent hash map that stores its keys in order
* of submission. At shipping time, the concurrent map is "sealed"
* (picture a truck with its cargo door being closed)
* and its contents presented as an immutable map, and is replaced
* by a new concurrent map ready to accept values.
*
* Consumers of this class that submit information to it, are expected to
* know that this contains a concurrent collection, and should use the
* compareAndSet paradigm, e.g. the following:
*
* LoadingDock loadingDock = ...
* boolean done = false;
* while (!done)
* {
* V oldValue = loadingDock.get();
* V newValue = computeNewValue(oldValue, otherInformation);
* if (oldValue == null)
* done = loadingDock.putIfAbsent(newValue) == null;
* else
* done = loadingDock.replace(oldValue, newValue) == oldValue;
* }
*
*
* Keys and values must be non-null. Keys are not ordered.
*/
class LoadingDock<K,V>
{
/**
* analogous to ConcurrentMap's replace, putIfAbsent, and get methods
*/
public boolean replace(K key, V oldValue, V newValue);
public V putIfAbsent(K key, V value);
public V get(K key)
/* see above */
public Map<K,V> ship();
}
私は2つの問題を抱えていますこれとともに。
JavaとGuavaのどちらにもConcurrentLinkedHashMapが含まれていないことが1つあります。これはなぜ私がそのような獣の微妙なものを見逃しているのか不思議に思います。 putIfAbsent()
が呼び出されてnullを返す場合、リストにキーを追加するクラスでConcurrentHashMapをデコレートすることで自分自身を作ることができるようです - ConcurrentHashMapで上記以外のメソッドは必要ありませんが、 putIfAbsent()
への呼び出しを除いて、マップに新しいキーを追加する方法はありません。
ship()
を実装する方法を考えることができないということです。ship()が呼び出されたときに、LoadingDockはすべての新しい呼び出しを新しいマップに指示する必要があります。並行書込みがすべて完了するまで古いマップを戻すことはできません。 (そうでなければ、AtomicReferenceを使用して同時マップを保持しています)
これを同期させる必要はありませんか?
私は今は 'synchronized'でこれを行い、パフォーマンスが問題であれば後で最適化を試みるべきだと思っています...問題は私が期待するところです。 –
同期なしで並行処理を処理する良い方法の1つは、aakaライブラリhttp://akka.io/downloads/を使用することです。Javaコードからaakaライブラリを使用できます。また、スカラーアクターライブラリを使用することもできます。 – Masa