Svake referanser i Java

1. Oversikt

I denne artikkelen vil vi se på konseptet med en svak referanse - på Java-språket.

Vi skal forklare hva dette er, hva de brukes til, og hvordan vi kan jobbe ordentlig med dem.

2. Svake referanser

En svakt referert gjenstand blir ryddet av søppeloppsamleren når den er lett tilgjengelig.

Svak tilgjengelighet betyr at en objektet har verken sterke eller myke referanser som peker på det. Objektet kan bare nås ved å krysse en svak referanse.

For det første fjerner Garbage Collector en svak referanse, slik at referenten ikke lenger er tilgjengelig. Deretter plasseres referansen i en referansekø (hvis noen tilknyttet eksisterer) hvor vi kan få den fra.

Samtidig kommer tidligere svakt tilgjengelige objekter til å bli avsluttet.

2.1. Svake mot myke referanser

Noen ganger er forskjellen mellom svake og myke referanser uklar. Myke referanser er i utgangspunktet en stor LRU-cache. Det er, vi bruker myke referanser når referenten har god sjanse for å bli gjenbrukt i nær fremtid.

Siden en myk referanse fungerer som en cache, kan den fortsette å nås selv om referenten ikke er det. Faktisk er en myk referanse kvalifisert for innsamling hvis og bare hvis:

  • Referenten er ikke sterkt tilgjengelig
  • Den myke referansen er ikke tilgjengelig nylig

Så en myk referanse kan være tilgjengelig i minutter eller til og med timer etter at referenten blir utilgjengelig. På den annen side vil en svak referanse bare være tilgjengelig så lenge referenten fortsatt er rundt.

3. Bruk tilfeller

Som det fremgår av Java-dokumentasjonen, svake referanser brukes oftest til å implementere kanoniseringskartlegginger. En kartlegging kalles kanonisert hvis den bare inneholder en forekomst av en bestemt verdi. I stedet for å lage et nytt objekt, ser det opp det eksisterende i kartleggingen og bruker det.

Selvfølgelig, den mest kjente bruk av disse referansene er WeakHashMap klasse. Det er implementeringen av Kart grensesnitt der hver nøkkel er lagret som en svak referanse til den gitte nøkkelen. Når søppeloppsamleren fjerner en nøkkel, slettes også enheten som er tilknyttet denne nøkkelen.

For mer informasjon, sjekk ut vår guide til WeakHashMap.

Et annet område der de kan brukes er Lapsed Listener-problemet.

En forlegger (eller et emne) har sterke referanser til alle abonnenter (eller lyttere) for å varsle dem om hendelser som har skjedd. Problemet oppstår når en lytter ikke kan avslutte abonnementet på en utgiver.

Derfor kan en lytter ikke samle søppel, siden en sterk referanse til den fremdeles er tilgjengelig for en utgiver. Følgelig kan minnelekkasjer skje.

Løsningen på problemet kan være et emne som har en svak referanse til en observatør som lar den tidligere samle søppel uten behov for å melde seg ut (merk at dette ikke er en komplett løsning, og det introduserer noen andre problemer som ikke er dekket her).

4. Arbeide med svake referanser

Svake referanser er representert av java.lang.ref.WeakReference klasse. Vi kan initialisere det ved å sende en referent som en parameter. Eventuelt kan vi tilby en java.lang.ref.ReferenceQueue:

Objektreferent = nytt objekt (); ReferenceQueue referenceQueue = ny ReferenceQueue (); WeakReference weakReference1 = ny WeakReference (referent); WeakReference weakReference2 = new WeakReference (referent, referenceQueue); 

Referenten til en referanse kan hentes av metoden, og fjernet manuelt ved hjelp av klar metode:

Objekt referent2 = weakReference1.get (); weakReference1.clear (); 

Mønsteret for trygt arbeid med denne typen referanser er det samme som med myke referanser:

Objekt referent3 = weakReference2.get (); hvis (referent3! = null) {// GC har ikke fjernet forekomsten ennå} ellers {// GC har fjernet forekomsten}

5. Konklusjon

I denne raske opplæringen så vi på lavnivåkonseptet med en svak referanse i Java - og fokuserte på de vanligste scenariene for å bruke disse.


$config[zx-auto] not found$config[zx-overlay] not found