1. Gambaran keseluruhan
Dalam artikel ini, kita akan melihat konsep rujukan yang lemah - dalam bahasa Jawa.
Kami akan menerangkan apakah ini, apa yang mereka gunakan, dan bagaimana bekerja dengan mereka dengan betul.
2. Rujukan Lemah
Objek yang dirujuk dengan lemah dibersihkan oleh Pemungut Sampah apabila ia dapat dijangkau dengan lemah.
Jangkauan yang lemah bermaksud bahawa objek tidak mempunyai rujukan kuat atau lembut yang menunjuk ke arahnya . Objek dapat dicapai hanya dengan melintasi rujukan yang lemah.
Pertama, Pengumpul Sampah membersihkan rujukan yang lemah, jadi rujukan tidak dapat diakses lagi. Kemudian rujukan diletakkan dalam barisan rujukan (jika ada yang berkaitan) di mana kita dapat memperolehnya.
Pada masa yang sama, objek yang sebelumnya mudah dijangkau akan diselesaikan.
2.1. Rujukan Lemah vs Lembut
Kadang-kadang perbezaan antara rujukan lemah dan lembut tidak jelas. Rujukan lembut pada dasarnya adalah cache LRU yang besar. Maksudnya, kita menggunakan referensi lembut ketika referensi berpeluang digunakan kembali dalam waktu dekat .
Oleh kerana rujukan lembut bertindak sebagai cache, ia mungkin terus dapat dicapai walaupun rujukan itu sendiri tidak. Sebenarnya, rujukan lembut layak untuk dikumpulkan jika dan hanya jika:
- Rujukan tidak dapat dicapai dengan kuat
- Rujukan lembut tidak diakses baru-baru ini
Jadi rujukan lembut mungkin tersedia selama beberapa minit atau bahkan beberapa jam setelah rujukan menjadi tidak dapat dicapai. Sebaliknya, rujukan yang lemah akan tersedia hanya selagi rujukannya masih ada.
3. Kes Penggunaan
Seperti yang dinyatakan oleh dokumentasi Java, rujukan lemah paling sering digunakan untuk melaksanakan pemetaan kanonik . Pemetaan dipanggil kanonikal jika hanya menyimpan satu contoh nilai tertentu. Daripada membuat objek baru, ia mencari objek yang ada dalam pemetaan dan menggunakannya.
Sudah tentu, penggunaan rujukan ini yang paling terkenal adalah kelas WeakHashMap . Ini adalah pelaksanaan antara muka Peta di mana setiap kunci disimpan sebagai rujukan lemah untuk kunci yang diberikan. Apabila Pengutip Sampah membuang kunci, entiti yang berkaitan dengan kunci ini juga akan dihapuskan.
Untuk maklumat lebih lanjut, lihat panduan kami ke WeakHashMap.
Kawasan lain di mana mereka boleh digunakan adalah masalah Pendengar Lapsed .
Penerbit (atau subjek) mempunyai rujukan kuat kepada semua pelanggan (atau pendengar) untuk memberitahu mereka mengenai peristiwa yang berlaku. Masalahnya timbul apabila pendengar tidak berjaya berhenti berlangganan dari penerbit.
Oleh itu, pendengar tidak boleh dikumpulkan sampah kerana rujukan yang kuat masih boleh didapati oleh penerbit. Akibatnya, kebocoran memori mungkin berlaku.
Penyelesaian untuk masalah itu boleh menjadi subjek yang mempunyai rujukan lemah kepada pemerhati yang memungkinkan bekas itu dikumpulkan sampah tanpa perlu berhenti berlangganan (perhatikan bahawa ini bukan penyelesaian lengkap, dan ini memperkenalkan beberapa masalah lain yang tidak dilindungi di sini).
4. Bekerja Dengan Rujukan Lemah
Rujukan lemah diwakili oleh kelas java.lang.ref.WeakReference . Kita dapat menginisialisasi dengan memberikan referensi sebagai parameter. Sebagai pilihan, kami dapat menyediakan java.lang.ref.ReferenceQueue :
Object referent = new Object(); ReferenceQueue referenceQueue = new ReferenceQueue(); WeakReference weakReference1 = new WeakReference(referent); WeakReference weakReference2 = new WeakReference(referent, referenceQueue);
Referensi rujukan dapat diambil dengan kaedah get , dan dikeluarkan secara manual menggunakan kaedah yang jelas :
Object referent2 = weakReference1.get(); weakReference1.clear();
Corak untuk selamat bekerja dengan jenis rujukan ini sama dengan rujukan lembut:
Object referent3 = weakReference2.get(); if (referent3 != null) { // GC hasn't removed the instance yet } else { // GC has cleared the instance }
5. Kesimpulan
Dalam tutorial ringkas ini, kami melihat konsep tahap rendah dari rujukan lemah di Java - dan memfokuskan pada senario yang paling biasa untuk menggunakannya.