5

Google Guava(Collections)のMapMakerが本当に好きな人をたくさん読んだことがありますが、それをうまく利用することはできません。

javadocを読みましたが、ConcurrentHashMapのように動作すると書かれています。また、ほとんどの場合、 WeakHashMapnew MapMaker().weakKeys().makeMap()のドロップイン代替として使用できるとも述べています。

ただし、 ConcurrentHashMapWeakHashMapのjavadocsを読むと、いつ使用すると便利か疑問に思います。あなたが地図に置いたものがそこにあるという保証はないように私には思えますか、それとも私は誤解しましたか?

4

4 に答える 4

7

重要なMapMakerのは、作成するマップの種類には多くのオプションがあり、それらのマップが多くの目的に役立つことを可能にするということです。

  • Dirkは、弱鍵の使用例を示しています。
  • システムはメモリが必要な場合にキャッシュからエントリを自由に削除できるため、メモリ不足を心配せずにマップに値をキャッシュできるため、ソフト値はキャッシュに役立ちます。
  • 一定の時間が経過するとエントリの有効期限が切れるように選択できます。コストのかかる操作を実行して更新する前に、特定のデータを特定の期間キャッシュする必要がある場合があるため、これはキャッシュにも役立ちます。
  • 私の好きなことの1つは、コンピューティングマップを作成することです。コンピューティングマップは、を使用Function<K, V>して、特定のキーに関連付けられている値がまだマップにない場合は、その値を自動的に取得します。これは、ソフト値や有効期限とうまく組み合わされます。エントリがマップによって削除された後(メモリの需要または有効期限のため)、次にそのキーに関連付けられた値が要求されたときに、そのキーは自動的に取得され、マップにもう一度キャッシュされます。
于 2010-09-01T15:57:13.710 に答える
6

...そしてそれはそれのポイントです。弱参照は、オブジェクトをメモリに無期限に保持したくない(または保持する余裕がない)場合に役立ちます。次のユースケースを考えてみましょう。情報をクラスに関連付ける必要があります。ここで、クラスがリロードされる可能性のある環境(Tomcat、またはOSGi環境など)で実行しているため、ガベージコレクターが安全であると判断したときにクラスの古いバージョンを再利用できるようにする必要があります。 。

これを実装する最初の試みは、次のようになります。

class ClassAssoc {
    private final IdentityHashMap<Class<?>,MyMetaData> cache = new ...;
}

ここでの問題は次のとおりです。これにより、cacheメンバー内のすべてのクラスが永久に保持され(または、少なくとも手動で削除されない限り)、クラスから参照されるすべてのもの(静的メンバー値、クラスローダー情報、 ...)

弱参照を使用することにより、ガベージコレクターは、クラスへの他の参照(通常はインスタンス)が存在しなくなるとすぐに、古いバージョンのクラスを再利用できます。一方、そのような参照が存在する限り、値は弱参照オブジェクトからも到達可能であることが保証されているため、キャッシュテーブル内の有効なキーです。

並行性やその他の残虐行為を画像に追加すると、MapMakerオプションで提供されるものになります...

于 2010-09-01T12:03:21.667 に答える
0

誰か(マップ以外)がエントリを参照しているWeakHashmap間、エントリはマップに保持されます。マップがエントリの参照を保持していることに他の誰もいない場合は、次のGC実行でエントリを削除できます。

于 2010-09-01T11:58:14.917 に答える
-2

ConcurrentHashMapMapマルチスレッド環境で安全に使用できるaです。同時実行性とは、ブロックせずにこのマップにアクセスするためにさまざまなスレッドを使用できることが多いMapため、通常の同期バージョンよりも優れています。

于 2010-09-01T12:08:34.980 に答える