Svage referencer i Java

1. Oversigt

I denne artikel vil vi se på begrebet svag reference - på Java-sproget.

Vi skal forklare, hvad disse er, hvad de bruges til, og hvordan vi arbejder korrekt med dem.

2. Svage referencer

En genstand, der er svagt refereret til, ryddes af affaldssamleren, når den er svagt tilgængelig.

Svag tilgængelighed betyder, at en objekt har hverken stærke eller bløde referencer, der peger på det. Objektet kan kun nås ved at krydse en svag reference.

For det første rydder affaldssamleren en svag reference, så referenten er ikke længere tilgængelig. Derefter placeres referencen i en referencekø (hvis der findes en tilknyttet), hvor vi kan få den fra.

Samtidig vil tidligere svagt tilgængelige objekter blive afsluttet.

2.1. Svage vs bløde referencer

Sommetider er forskellen mellem svage og bløde referencer uklar. Bløde referencer er dybest set en stor LRU-cache. Det er, vi bruger bløde referencer, når referenten har en god chance for at blive genbrugt i den nærmeste fremtid.

Da en blød reference fungerer som en cache, kan den fortsat være tilgængelig, selvom referenten ikke er det. Faktisk er en blød reference berettiget til indsamling, hvis og kun hvis:

  • Referenten er ikke stærkt tilgængelig
  • Den bløde reference er ikke tilgængelig for nylig

Så en blød reference kan være tilgængelig i minutter eller endda timer efter, at referenten bliver utilgængelig. På den anden side vil en svag reference kun være tilgængelig, så længe dens referent stadig findes.

3. Brug sager

Som anført i Java-dokumentation, svage referencer bruges oftest til at implementere kanonisering af kortlægninger. En kortlægning kaldes kanonikaliseret, hvis den kun indeholder en forekomst af en bestemt værdi. I stedet for at oprette et nyt objekt ser det op på det eksisterende i kortlægningen og bruger det.

Selvfølgelig er det mest kendte anvendelse af disse referencer er WeakHashMap klasse. Det er implementeringen af Kort interface, hvor hver nøgle er gemt som en svag reference til den givne nøgle. Når affaldssamleren fjerner en nøgle, slettes den enhed, der er knyttet til denne nøgle, også.

For mere information, se vores guide til WeakHashMap.

Et andet område, hvor de kan bruges, er problemet med bortfaldet lytter.

En udgiver (eller et emne) har stærke referencer til alle abonnenter (eller lyttere) for at underrette dem om begivenheder, der er sket. Problemet opstår, når en lytter ikke med succes kan afmelde sig en udgiver.

Derfor kan en lytter ikke samle skrald, da en stærk henvisning til det stadig er tilgængelig for en udgiver. Derfor kan hukommelseslækage ske.

Løsningen på problemet kan være et emne, der indeholder en svag henvisning til en observatør, der gør det muligt for den førstnævnte at blive indsamlet skrald uden behov for at blive afmeldt (bemærk, at dette ikke er en komplet løsning, og det introducerer nogle andre problemer, som ikke er dækket her).

4. Arbejde med svage referencer

Svage referencer er repræsenteret af java.lang.ref.WeakReference klasse. Vi kan initialisere det ved at sende en referent som en parameter. Eventuelt kan vi levere en java.lang.ref.ReferenceQueue:

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

Henvisningen til en reference kan hentes af metode og fjernes manuelt ved hjælp af klar metode:

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

Mønsteret for sikkert arbejde med denne type referencer er det samme som med bløde referencer:

Objektreferent3 = weakReference2.get (); hvis (referent3! = null) {// GC har ikke fjernet forekomsten endnu} ellers {// GC har ryddet forekomsten}

5. Konklusion

I denne hurtige vejledning kiggede vi på lavt niveau konceptet med en svag reference i Java - og fokuserede på de mest almindelige scenarier for at bruge disse.