序文
この記事では、Javaでの定義、基本的な使用シナリオ、および弱い参照の使用方法を誰もが理解するのに役立つ、なぜ、どのように役立つかの観点から、Javaの弱い参照を調査しようとしています。
1。何 - 弱い引用とは何ですか?
Javaの弱い参照はjava.lang.ref.WeakReference<T>クラスを特に参照しています。まず公式のドキュメントを説明しましょう。
弱い参照オブジェクトの存在は、ゴミコレクターによってリサイクルされることを指し示すオブジェクトを妨げません。弱い参照の最も一般的な使用は、カノニカル化マッピング(ハッシュテーブルなど)を実装することです。
ゴミコレクターが特定の時点でオブジェクトが弱く到達可能であると判断したと仮定すると、つまり、現在のすべてのポイントは弱い参照です)、ガーバージコレクターはオブジェクトへのすべての弱い参照をクリアし、弱いリーチ可能なオブジェクトを最終化可能なものとしてマークし、後でリサイクルされます。同時に、または後で、ゴミコレクターは、弱い参照オブジェクトを作成するときに指定された参照キューに新しくクリアされた弱い参照を配置します。
実際、Javaには4種類の参照があります。これは、強いものから弱いものから弱いものです。強い参照、ソフトリファレンス、弱い参照、仮想参照です。
以下に、弱い引用以外に他の3つの引用を簡単に紹介します。
1。強い参照:通常、新しいオブジェクトを作成したときに返すリファレンスは強力な参照です。一連の強力な参照を通じてオブジェクトに到達できる場合、それは強く到達可能であるため、リサイクルされません。
2。ソフト参照:ソフト参照と弱い基準の違いは、オブジェクトが弱い参照によって到達可能である場合、現在のメモリが十分であるかどうかに関係なくリサイクルされるのに対し、ソフト参照によって到達可能なオブジェクトは、メモリが不十分な場合にのみリサイクルされることです。したがって、ソフト参照は弱い参照よりも「強い」ものです。
3。Phantomリファレンス:仮想リファレンスはJavaで最も弱いリファレンスです。それで、それはどれほど弱いですか?それは非常に脆弱であるため、仮想参照を介して参照されるオブジェクトを取得することさえできません。仮想参照の唯一の目的は、それが指すオブジェクトがリサイクルされると、仮想参照自体が参照キューに追加され、それが指すオブジェクトがリサイクルされたことを記録するために使用されることです。
2。なぜ - なぜ弱い参照を使用するのですか?
次のシナリオを考慮してください。現在、製品を表すProductクラスがあります。これは、非スケーラブルになるように設計されており、現時点では各製品に番号を追加したいと考えています。解決策の1つはHashMap<Product, Integer>を使用することです。だから問題が発生します。メモリにProductオブジェクトが存在する必要がなくなった場合(たとえば、この製品は販売されています)、それへの参照がproductAであると仮定すると、 nullとしてproductAに値を割り当てます。ただし、現時点では、過去にproductAが指すProductオブジェクトは、 HashMapによって明らかに参照されるため、リサイクルされません。したがって、この場合、 Productオブジェクトを真にリサイクルしたい場合は、 nullに強い参照を割り当てるだけでは不十分です。また、 HashMapから対応するエントリを削除する必要があります。明らかに、私たちは自分で「 HashMapから必要なエントリを削除する」という作業を完了したくありません。ゴミコレクターに伝えたい: HashMapのkeyのみがProductオブジェクトを参照し、対応するProductオブジェクトをリサイクルできます。明らかに、弱い引用の以前の定義に基づいて、弱い引用を使用すると、この目標を達成するのに役立ちます。 HashMapのkeyとして、 Productオブジェクトを指す弱い参照オブジェクトを使用する必要があります。
3.どのように - どのように弱い参照を使用しますか?
上記のシナリオを例として見てみましょう。私たちはProductオブジェクトをHashMapのkeyとして指している弱い参照オブジェクトを使用し、次のようなこの弱い参照オブジェクトを定義するだけです。
Product Producta = new Product(...); weakReference <Product> weakProducta = new weakReference <>(producta);
これで、オブジェクトのweakProductA参照されている場合、 ProductオブジェクトproductAを指します。それでは、 weakProductを通じて指すProductオブジェクトproductAどのように取得するのでしょうか?
それは非常にシンプルです、次のコードが必要です:
製品製品= weakproducta.get();
実際、この場合、JavaクラスライブラリはWeakHashMapクラスを提供します。このクラスを使用すると、そのキーは自然に弱い参照オブジェクトであり、元のオブジェクトを手動でラップする必要はなくなりました。このようにして、 productA nullになると(それがメモリに存在する必要がなくなることを示します)、 Product参照ProductはweakProductAであり、明らかに対応するProductオブジェクトProduct弱く、現時点で到達することができます。
4。参照キュー
キューを引用するという概念を簡単に紹介しましょう。実際、 WeakReferenceクラスには2つのコンストラクターがあります。
//指定されたオブジェクトへの弱い参照を作成します
2番目のコンストラクターは、型ReferenceQueueのパラメーターを提供していることがわかります。このパラメーターを提供することにより、作成された弱い参照オブジェクトを参照キューに登録します。このようにして、ゴミコレクターによってクリアされると、参照キューに送信され、統一された方法でこれらのクリーニングされた弱い参照オブジェクトを管理できます。
5。概要
さて、この記事の内容はここで終わります。個人レベルが限られているため、物語には必然的に不正確または不明確な側面があります。 wulin.comへのご支援に感謝します。