Rumah  >  Artikel  >  Java  >  Mempelajari dan memahami rujukan lemah Java

Mempelajari dan memahami rujukan lemah Java

WBOY
WBOYke hadapan
2023-04-25 18:25:09901semak imbas

Apa——Apakah rujukan yang lemah?

Rujukan lemah dalam Java secara khusus merujuk kepada kelas java.lang.ref.WeakReference 🎜>Kewujudan objek rujukan yang lemah tidak akan menghalang objek yang ditunjukkannya daripada dikitar semula oleh pemungut sampah. Penggunaan rujukan lemah yang paling biasa adalah untuk melaksanakan pemetaan kanonik (seperti jadual cincang).


Andaikan pemungut sampah menentukan pada masa tertentu bahawa objek lemah boleh dicapai (iaitu, semua titik semasa yang menunjuk kepadanya adalah rujukan lemah), maka pemungut sampah akan Kosongkan semua rujukan yang lemah ke objek, dan kemudian tandakan objek yang boleh dicapai dengan lemah sebagai boleh dimuktamadkan supaya ia akan dikitar semula kemudian. Pada masa yang sama atau kemudian, pemungut sampah akan meletakkan rujukan lemah yang baru sahaja dikosongkan ke dalam baris gilir rujukan (Reference Queue) yang ditentukan semasa mencipta objek rujukan yang lemah.

Sebenarnya, terdapat empat jenis rujukan dalam Java, iaitu daripada kuat kepada lemah ialah: rujukan kuat, rujukan lembut, rujukan lemah dan rujukan maya. Di bawah ini kami memperkenalkan secara ringkas tiga jenis rujukan yang lain kecuali rujukan yang lemah:

    Rujukan Kuat: Biasanya apabila kita mencipta objek baru melalui yang baru, rujukan yang dikembalikan adalah rujukan yang kuat, jika objek boleh dicapai melalui satu siri rujukan yang kuat, ia boleh dicapai dengan kuat, maka ia tidak akan dikitar semula
  • Rujukan Lembut: Rujukan Lembut Perbezaan antara rujukan dan rujukan lemah ialah jika objek boleh dicapai dengan rujukan yang lemah, ia akan dikitar semula tanpa mengira sama ada memori semasa mencukupi, manakala objek yang boleh dicapai oleh rujukan lembut akan dikitar semula apabila ingatan tidak mencukupi, jadi rujukan lembut adalah lebih baik daripada rujukan lemah. Rujukan adalah "lebih kuat"
  • Rujukan Hantu: Rujukan Hantu ialah rujukan paling lemah di Jawa, jadi sejauh manakah ia lemah? Ia sangat rapuh sehinggakan kita tidak boleh mendapatkan objek yang dirujuk melalui rujukan maya Satu-satunya tujuan rujukan maya ialah apabila objek yang dituju dikitar semula, rujukan maya itu sendiri akan ditambahkan pada baris gilir rujukan untuk merekodkannya. Objek runcing telah dikitar semula.
Mengapa——Mengapa menggunakan rujukan yang lemah?


Pertimbangkan senario berikut: Kini terdapat kelas Produk yang mewakili produk Kelas ini direka bentuk untuk tidak boleh dilanjutkan, dan pada masa ini kami mahu menambah nombor pada setiap produk . Satu penyelesaian ialah menggunakan HashMap. Jadi persoalan timbul Jika kita tidak lagi memerlukan objek Produk untuk wujud dalam ingatan (contohnya, produk ini telah dijual), dengan mengandaikan bahawa rujukan yang menunjuk kepadanya adalah produkA, kita akan menetapkan nilai produkA kepada null pada masa ini . Walau bagaimanapun, pada masa ini Objek Produk yang ditunjuk oleh productA pada masa lalu tidak akan dikitar semula kerana ia jelas masih dirujuk oleh HashMap.

Jadi dalam kes ini, jika kita ingin benar-benar mengitar semula objek Produk, tidak cukup dengan hanya memberikan rujukan kukuhnya kepada null, tetapi juga untuk mengalih keluar masukan yang sepadan daripada HashMap. Jelas sekali kami tidak mahu melakukan kerja "mengalih keluar entri yang tidak diperlukan lagi daripada HashMap" sendiri Kami ingin memberitahu pemungut sampah bahawa apabila hanya kekunci dalam HashMap merujuk kepada objek Produk, objek Produk yang sepadan boleh menjadi. dikitar semula. Jelas sekali, menurut definisi rujukan lemah sebelum ini, menggunakan rujukan yang lemah boleh membantu kita mencapai matlamat ini. Kita hanya perlu menggunakan objek rujukan lemah yang menunjuk ke objek Produk sebagai kunci dalam HashMap.

Bagaimana——Bagaimana untuk menggunakan rujukan yang lemah?


Ambil senario yang diterangkan di atas sebagai contoh Kami menggunakan objek rujukan yang lemah yang menunjuk ke objek Produk sebagai kunci HashMap Kami hanya perlu mentakrifkan objek rujukan yang lemah seperti ini :

Produk produkA = Produk baharu(...);
WeakReference weakProductA = WeakReference<>(productA);



Sekarang, jika objek weakProductA dirujuk Ia menunjuk kepada Product object productA. Jadi bagaimana kita mendapatkan produk objek ProdukA yang ditunjukkannya melalui weakProduct? Ia sangat mudah. ​​Anda hanya memerlukan kod berikut:

Product product = weakProductA.get();
Malah, untuk situasi ini, perpustakaan kelas Java menyediakan kami kelas WeakHashMap, yang boleh digunakan dengan kelas ini, kuncinya secara semula jadi adalah objek rujukan yang lemah, dan kita tidak perlu membungkus objek asal secara manual. Dengan cara ini, apabila productA menjadi batal (menunjukkan bahawa Produk yang dirujuknya tidak perlu lagi wujud dalam ingatan), objek rujukan lemah weakProductA menunjuk ke objek Produk Jelas sekali, objek Produk yang sepadan adalah lemah pada masa ini. jadi rujukan lemah yang menunjuk kepadanya akan dikosongkan, objek Produk akan dikitar semula serta-merta, dan objek rujukan lemah yang menunjuk kepadanya akan memasuki baris gilir rujukan.

Barisan Rujukan


Mari perkenalkan secara ringkas konsep baris gilir rujukan. Malah, kelas WeakReference mempunyai dua pembina:

Kita dapat melihat bahawa pembina kedua menyediakan parameter jenis ReferenceQueue Dengan menyediakan parameter ini, kita mencipta rujukan yang lemah Objek didaftarkan pada rujukan baris gilir, supaya apabila ia dibersihkan oleh pemungut sampah, ia akan dihantar ke baris gilir rujukan, dan kami boleh menguruskan objek rujukan lemah yang dibersihkan ini secara seragam.
//创建一个指向给定对象的弱引用
WeakReference(T referent) 
//创建一个指向给定对象并且登记到给定引用队列的弱引用
WeakReference(T referent, ReferenceQueue<? super T> q)

Atas ialah kandungan terperinci Mempelajari dan memahami rujukan lemah Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam