Slabe reference u Javi

1. Pregled

U ovom ćemo članku pogledati koncept slabe reference - na jeziku Java.

Objasnit ćemo što su to, za što se koriste i kako pravilno raditi s njima.

2. Slabe reference

Sakupljač smeća uklanja slabo referencirani objekt kada je slabo dostupan.

Slaba dostupnost znači da an objekt nema ni jake ni meke reference koje upućuju na njega. Do objekta se može doći samo prelaskom slabe reference.

Prvo, Sakupljač smeća uklanja slabu referencu, pa referent više nije dostupan. Tada se referenca stavlja u red referenci (ako postoji povezano) odakle je možemo dobiti.

Istovremeno će se dovršiti slabo dostupni objekti.

2.1. Slabe vs meke reference

Ponekad je razlika između slabih i mekih referenci nejasna. Meke reference u osnovi su velika LRU predmemorija. To je, koristimo meke reference kada referent ima dobre šanse za ponovnu upotrebu u bliskoj budućnosti.

Budući da meka referenca djeluje kao predmemorija, ona će možda i dalje biti dostupna čak i ako sam referent nije. U stvari, soft referenca ispunjava uvjete za prikupljanje samo i samo ako:

  • Referent nije teško dostupan
  • Soft referenci se nedavno ne pristupa

Tako meka referenca može biti dostupna nekoliko minuta ili čak sati nakon što referent postane nedostižan. S druge strane, slaba referenca bit će dostupna samo dok je njezin referent još uvijek prisutan.

3. Koristite slučajeve

Kao što navodi Java dokumentacija, slabe reference najčešće se koriste za provođenje kanonizirajućih preslikavanja. Mapiranje se naziva kanoniciziranim ako sadrži samo jedan primjerak određene vrijednosti. Umjesto da stvara novi objekt, on traži postojeći u mapiranju i koristi ga.

Naravno, najpoznatija upotreba ovih referenci je WeakHashMap razred. To je provedba Karta sučelje gdje je svaki ključ pohranjen kao slaba referenca na dati ključ. Kad Sakupljač smeća ukloni ključ, briše se i entitet povezan s tim ključem.

Za više informacija pogledajte naš vodič za WeakHashMap.

Još jedno područje na kojem se mogu koristiti je problem Lapsed Listenera.

Izdavač (ili subjekt) ima snažne reference na sve pretplatnike (ili slušatelje) kako bi ih obavijestio o događajima koji su se dogodili. Problem nastaje kad se slušatelj ne može uspješno odjaviti od izdavača.

Stoga slušatelj ne može sakupljati smeće, jer je snažna referenca na njega još uvijek dostupna izdavaču. Slijedom toga, može doći do curenja memorije.

Rješenje problema može biti subjekt koji slabo upućuje na promatrača koji dopušta da se prvo odvozi smeće bez potrebe za odjavom pretplate (imajte na umu da ovo nije cjelovito rješenje i uvodi neka druga pitanja koja nisu ovdje pokriveni).

4. Rad sa slabim referencama

Slabe reference predstavljaju java.lang.ref.WeakReference razred. Možemo ga inicijalizirati prosljeđivanjem referenta kao parametra. Po želji možemo pružiti a java.lang.ref.ReferenceQueue:

Referent objekta = novi Object (); ReferenceQueue referenceQueue = novi ReferenceQueue (); WeakReference slabReference1 = novi WeakReference (referent); WeakReference slabReference2 = novi WeakReference (referent, referenceQueue); 

Referent reference može dohvatiti dobiti metodom i uklonjen ručno pomoću čisto metoda:

Referent objekta2 = slabReference1.get (); slabReference1.clear (); 

Uzorak za siguran rad s ovom vrstom referenci jednak je kao i kod mekih referenci:

Referent objekta3 = slabReference2.get (); if (referent3! = null) {// GC još nije uklonio instancu} else {// GC je obrisao instancu}

5. Zaključak

U ovom smo brzom vodiču pogledali koncept niske razine slabe reference u Javi - i usredotočili se na najčešće scenarije za njihovo korištenje.