4

私はこのようなものを持っています:

 private Map<MyObj1, MyObj2> map = new WeakHashMap<MyObj1, MyObj2>();

 ... somewhere in the code ...
 MyObj1 myObj1 = new MyObj1();
 map.put(myObj1, new MyObj2();
 ...
 myObj1 = null;

... somewhere else in a thread ... (I would like to pass to a checkThis(MyObj2) method the Value associated with the entry that was removed from the Map)
/* something like this maybe */
while (true) {
    MyObj2 myObj2 = referenceQueue.remove().get();
    checkThis(myObj2);
}

MyObj1キーは、GC が登場すると削除される可能性があり、それへの強い参照はありません。

削除されたキーに関連付けられた特定のマップ値オブジェクトに渡したいcheckThis(MyObj2)(おそらくReferenceQueue?)

これをコードに入れる方法がわかりません。

4

4 に答える 4

1

別の回答に関するコメントから:

セッションの有効期限が切れると (そして、アプリ コンテキストにそのセッションへの強い参照がない場合)、リストが反復され、実行を待機している残りのすべての Future でキャンセルが呼び出されます。これは、ユーザー セッションの有効期限が切れた場合でも実行されるスケジュールされたジョブを回避するためです。

これは、HttpSessionBindingListener

于 2010-07-06T18:44:21.680 に答える
1

参照キュー

WeakReference が null を返し始めると、それが指すオブジェクトはガベージになり、WeakReference オブジェクトはほとんど役に立たなくなります。これは通常、何らかのクリーンアップが必要であることを意味します。たとえば、WeakHashMap は、死んだ WeakReferences の数が増え続けるのを避けるために、そのような無効なエントリを削除する必要があります。

ReferenceQueue クラスを使用すると、無効な参照を簡単に追跡できます。ReferenceQueue を弱参照のコンストラクターに渡すと、参照オブジェクトが指しているオブジェクトがガベージになると、参照オブジェクトが自動的に参照キューに挿入されます。その後、一定の間隔で ReferenceQueue を処理し、無効な参照に必要なクリーンアップを実行できます。

使い方のチュートリアルについては、 このページを参照してください。

これを使用している理由を教えてください。有効な用途はほとんどありません。
つまり、キャッシュは有効な使用法ではありません (または、少なくとも良い使用法ではありません)。

編集:

このコードは、weakHashMap を使用するのと同等ですが、キューをマップと関連付けるために明示的にこれを行う必要があります。

HashMap aHashMap = new HashMap();
ReferenceQueue Queue = new ReferenceQueue();
MyWeakReference RefKey = new MyWeakReference(key, Queue);
aHashMap.put(RefKey, value);
于 2010-06-29T18:54:50.583 に答える
0

あなたがやりたいことに関する本当の問題は、使用されていないアイテムを解放するためにガベージコレクターWeakHashMapに依存していることです。

GC は、ユーザーが行っていることをまったく尊重せずに、必要なときにいつでも作業を行うため、ハッシュマップの変更を追跡することは困難です。実際あなたの言うことは

「強い参照がない場合、MyObj1 キーは削除されます」

は正確ではありません。MyObj1周りに強力な参照がない場合は GC によって自由に解放されますが、解放する必要がない場合は単純に解放されません。

于 2010-06-29T16:14:22.000 に答える
0

WeakHashMapプリアンブルから(イタリック体を追加):

弱いキーを持つハッシュテーブルベースの Map 実装。WeakHashMap のエントリは、そのキーが通常使用されなくなったときに自動的に削除されます。より正確には、特定のキーのマッピングが存在しても、キーがガベージ コレクターによって破棄されること、つまり、ファイナライズ可能になり、ファイナライズされてから再利用されることを防ぐことはできません。キーが破棄されると、そのエントリは事実上マップから削除されるため、このクラスは他の Map 実装とは多少異なる動作をします。

ただし、WeakHashMap がエントリを「失った」ときは決して通知されません :-) 特定のインスタンスでのキーのみを気にする場合は、マップのスキャンを使用できます (これも実用的なものに限られます)。一部の n) に対して)。それ以外の場合は、ReferenceQueue についての直感に従ってください。

このリンクが役立つ場合があります: Java 参照オブジェクト

于 2010-06-29T16:16:44.697 に答える