5

エントリがタイムアウトし、一定期間後に削除されるマップを作成しようとしています。

基本的に<K, V> Map.put(K key, V value, long **time**)、エントリは即座にマップに配置され、時間(ミリ秒) 後に期限切れになります。今後、削除されたエントリを復元する必要はありませんが、マップに含まれていないことを確認したいと思います。

例:map.put("foo", "bar", 60l * 1000l)このキーと値のペアをマップ内に 1 分間 (60long と 1000long) 存続させます。

試行: ConcurentMap を使用しMap.put(K key, V value, long **time**)て、次のように実装します。
1. 呼び出します。 2.時間(ミリ秒)super.put(key, value)
スリープするスレッドを作成します。
remove(key)

質問: コメントしてください/スレッドセーフ、一貫性、または私の試みの欠陥の点でこれが良い考えかどうか教えてください。これを達成するためのより良い方法があると思われる場合は、アドバイスを提供してください。

編集:返信ありがとうございます。ここではメモリは問題ではありません。エントリの寿命が短いことだけを気にしています。ありがとうございました。

4

3 に答える 3

4

時間は、解決しようとしている問題の重要な部分ですか? それとも実装の詳細ですか?解決しようとしている問題がメモリの使用に関するものである場合、他に 2 つの可能性が思い浮かびます。

  • LRU マップ。これらはウェブ上にいくつかあります。
  • GC がそれらの項目を収集できるようにする WeakReference または SoftReference オブジェクトに基づくマップ。

編集

その場合、時間を節約できる既存の実装がいくつかあります。例えば:

于 2010-12-28T17:34:10.013 に答える
1

Guavaを見てみましょう。これは Google のコレクション ライブラリです。特に、CacheBuilder とその計算マップを調べます。その機能の 1 つは、「最後のアクセスまたは最後の書き込み以降に測定されたエントリの時間ベースの有効期限」です。

(CacheBuilderについて話すために編集されました。これは投稿してから新しく、質問により関連しています)

于 2011-08-02T01:01:56.157 に答える
1

何らかのメモリの問題 (マップは一時的なキャッシュ) のためにこれを行っている場合は、おそらくソフト参照 (ドキュメント) の使用を検討する必要があります。

于 2010-12-28T17:34:15.593 に答える