Kata pengantar
Artikel ini mencoba mengeksplorasi referensi yang lemah di Java dari perspektif apa, mengapa, dan bagaimana membantu semua orang memahami definisi, skenario penggunaan dasar dan metode penggunaan referensi lemah di Java.
1. Apa-apa kutipan yang lemah?
Referensi lemah di Java secara khusus merujuk ke kelas java.lang.ref.WeakReference<T> . Pertama -tama mari kita lihat dokumentasi resmi menjelaskannya:
Keberadaan objek referensi yang lemah tidak mencegah objek yang ditunjukkan agar tidak didaur ulang oleh pengumpul sampah. Penggunaan referensi lemah yang paling umum adalah untuk mengimplementasikan pemetaan kanonikal (seperti tabel hash).
Dengan asumsi bahwa pengumpul sampah memutuskan bahwa suatu objek dapat dijangkau dengan lemah pada titik waktu tertentu (yaitu, semua poin saat ini adalah referensi yang lemah), pengumpul sampah akan membersihkan semua referensi lemah ke objek, dan kemudian menandai objek yang dapat dijangkau yang dapat difinisikan, sehingga akan didaur ulang nanti. Pada waktu yang sama atau lebih lambat, pengumpul sampah akan menempatkan referensi lemah yang baru dibersihkan ke dalam antrian referensi yang ditentukan saat membuat objek referensi yang lemah.
Faktanya, ada empat jenis referensi di Java, yang berasal dari kuat hingga lemah: referensi yang kuat , referensi lunak , referensi lemah , dan referensi virtual .
Di bawah ini kami secara singkat memperkenalkan tiga kutipan lain selain kutipan yang lemah:
1. Referensi Kuat: Biasanya, referensi yang kami kembalikan ketika kami membuat objek baru melalui baru adalah referensi yang kuat. Jika suatu objek dapat dicapai melalui serangkaian referensi yang kuat, itu sangat dapat dijangkau, maka itu tidak akan didaur ulang.
2. Referensi Soft: Perbedaan antara referensi lunak dan referensi yang lemah adalah bahwa jika suatu objek dapat dijangkau dengan referensi yang lemah, itu akan didaur ulang terlepas dari apakah memori saat ini cukup, sedangkan objek yang dapat dicapai dengan referensi lunak hanya akan didaur ulang ketika memori tidak cukup. Oleh karena itu, referensi lunak "lebih kuat" daripada referensi yang lemah.
3. Referensi Phantom: Referensi Virtual adalah referensi terlemah di Java, jadi seberapa lemahnya itu? Sangat rapuh sehingga kita bahkan tidak bisa mendapatkan objek yang direferensikan melalui referensi virtual. Satu -satunya tujuan referensi virtual adalah bahwa ketika objek yang ditunjuk adalah didaur ulang, referensi virtual itu sendiri akan ditambahkan ke antrian referensi dan digunakan untuk merekam bahwa objek yang ditunjukkannya telah didaur ulang.
2. Mengapa-mengapa menggunakan referensi lemah?
Pertimbangkan skenario berikut: sekarang ada kelas Product yang mewakili produk, yang dirancang untuk tidak dapat discabilkan, dan pada saat ini kami ingin menambahkan angka ke setiap produk. Salah satu solusi adalah menggunakan HashMap<Product, Integer> . Jadi masalahnya datang. Jika kita tidak lagi membutuhkan objek Product yang ada dalam memori (misalnya, produk ini telah dijual), dengan asumsi bahwa referensi untuk itu adalah productA , kami akan menetapkan nilai ke productA sebagai null . Namun, pada saat ini, objek Product yang ditunjukkan oleh productA di masa lalu tidak akan didaur ulang, karena jelas dirujuk oleh HashMap . Jadi dalam hal ini, jika kita ingin benar -benar mendaur ulang objek Product , itu tidak cukup untuk hanya menetapkan referensi yang kuat untuk null , dan kita juga perlu menghapus entri yang sesuai dari HashMap . Jelas, kami tidak ingin menyelesaikan pekerjaan "menghapus tidak lagi diperlukan entri dari HashMap " sendiri. Kami ingin memberi tahu pengumpul sampah: hanya key dalam HashMap referensi objek Product , objek Product yang sesuai dapat didaur ulang. Jelas, berdasarkan definisi sebelumnya tentang kutipan yang lemah, menggunakan kutipan yang lemah dapat membantu kita mencapai tujuan ini. Kita hanya perlu menggunakan objek referensi lemah yang menunjuk ke objek Product sebagai key dalam HashMap .
3. Bagaimana-bagaimana menggunakan referensi yang lemah?
Ambil skenario yang diperkenalkan di atas sebagai contoh. Kami menggunakan objek referensi lemah yang menunjuk pada objek Product sebagai key HashMap , dan hanya mendefinisikan objek referensi yang lemah ini seperti ini:
Produk Produk = Produk Baru (...); WeakReference <Product> Lemah Lemah = Referensi Lemah Baru <> (Producta);
Sekarang, jika objek weakProductA direferensikan, itu menunjuk ke productA objek Product . Jadi bagaimana kita mendapatkan Product objek productA yang ditunjukkan melalui weakProduct ?
Ini sangat sederhana, hanya perlu kode berikut:
Produk Produk = Lemah Producta.get ();
Faktanya, untuk kasus ini, Perpustakaan Kelas Java memberi kita kelas WeakHashMap . Menggunakan kelas ini, kuncinya secara alami adalah objek referensi yang lemah, dan kita tidak perlu lagi membungkus objek asli secara manual. Dengan cara ini, ketika productA menjadi null (ini menunjukkan bahwa Product yang dirujuknya tidak perlu lagi ada dalam memori), Product referensi yang lemah adalah weakProductA , maka jelas objek Product yang sesuai lemah dan dapat dicapai pada saat ini, sehingga referensi lemah yang menunjuk ke sana akan dibersihkan, dan objek Product akan didaur ulang, dan referensi yang lemah yang menunjuk ke sana akan masuk ke dalam rujukan yang akan masuk.
4. Antrian referensi
Mari kita perkenalkan secara singkat konsep mengutip antrian. Faktanya, kelas WeakReference memiliki dua konstruktor:
// Buat referensi yang lemah ke objek yang diberikan Lemah Lemah (Referensi T) // Buat referensi lemah ke objek yang diberikan dan register referensi lemah ke antrian referensi yang diberikan Lemah Lemah (Referensi T, ReferenceQueue <? Super T> Q)
Kita dapat melihat bahwa konstruktor kedua memberikan parameter Type ReferenceQueue . Dengan memberikan parameter ini, kami mendaftarkan objek referensi lemah yang dibuat pada antrian referensi. Dengan cara ini, ketika dibersihkan oleh pengumpul sampah, itu akan dikirim ke antrian referensi, dan kami dapat mengelola objek referensi lemah yang dibersihkan ini dengan cara yang terpadu.
5. Ringkasan
Nah, konten artikel ini berakhir di sini. Karena tingkat pribadi yang terbatas, ada aspek yang tidak akurat atau tidak jelas dalam narasi. Saya harap Anda dapat menunjukkannya, terima kasih atas dukungan Anda untuk wulin.com.