Svag länk

Inom programmering är en svag referens en specifik typ av referens till dynamiskt skapade  objekt i system med sophämtning eller referensräkning . Det skiljer sig från starka referenser genom att sophämtaren inte tar hänsyn till förhållandet mellan referensen och föremålet på högen när den identifierar föremål som ska raderas. En svag referens låter dig alltså arbeta med ett objekt som en stark referens, men vid behov kommer objektet att raderas, även om det finns en svag referens till det. Vanliga referenser kallas ibland för "starka" referenser i samband med sophämtning.

Innehållet i konceptet

Konceptet med en svag referens finns i system och programmeringsspråk där sophämtning stöds - automatisk borttagning från minnet av objekt vars användning har upphört och inte längre kommer att återupptas. För att fastställa vilka objekt som är föremål för sophämtning används en eller annan version av nåbarhetsalgoritmen - ett objekt anses nåbart om det finns minst en referens i programmet. När det inte finns en enda referens till ett objekt kvar i programmet, det vill säga användningen av objektet har upphört, kan ett sådant objekt tas bort vid nästa lämpliga ögonblick.

Den beskrivna mekanismen för att frigöra minne kan i vissa fall generera minnesläckor på grund av "glömda" referenser, när referenser till skapade objekt lagras på flera ställen och när objektet inte längre används raderar programmeraren inte alla. För att undvika problem tvingas programmeraren att följa en ganska stel disciplin i användningen av länkar, vilket inte alltid är bekvämt.

För att undvika problem som detta kan ett programmeringsspråk eller miljö stödja så kallade svaga referenser . Sådana referenser används på samma sätt som vanliga referenser, men påverkar inte sophämtningen, eftersom de inte beaktas av referensräknemekanismen, och objektet som sådana referenser finns till kan raderas, om det inte finns vanliga referenser till det (som i detta sammanhang kan kallas "starka länkar").

Implementering och användning

I de numera vanliga skräpsamlade programmeringsspråken, Java och C# , stöds svaga referenser på systembiblioteksnivå. I Java tjänar klasserna java.lang.ref.WeakReference och för detta java.lang.ref.SoftReference, i C#, System.WeakReference.

Proceduren för att använda svaga referenser är i grunden densamma i alla system.

  1. När det krävs att lagra en svag referens skapas ett referensobjekt (en instans av klassen WeakReference), som skickas en normal ("stark") referens till målobjektet. Den godkända starka referensen släpps omedelbart och hänvisaren lagrar en kopia av den i en form som inte kan hindra sophämtaren från att ta bort motsvarande objekt. Själva hänvisaren sparas som ett vanligt objekt, det vill säga en vanlig, "stark" länk måste sparas till den.
  2. När det krävs att man använder en svag referens anropas en metod get()(i C#, en egenskap Target) på referraren, som skapar och returnerar en stark referens till objektet om det fortfarande finns, eller en nollpekare null ( nil) om objektet har redan har samlats in.
  3. Om hänvisaren returnerade en giltig referens används den sedan för att komma åt objektet på vanligt sätt. Eftersom get()det returnerar en stark referens kommer objektet inte att tas bort under dess användning. När användningen är klar blir objektet som hänvisaren hänvisar till tillgängligt för sophämtning igen. Det vill säga, om den starka länken som tagits emot från hänvisaren har raderats, för en ny användning av objektet, är det nödvändigt att erhålla en ny länk från hänvisaren och kontrollera att den är lika med en nollpekare.
  4. Om hänvisaren returnerade en nollpekare betyder det att objektet redan har tagits bort av sopsamlaren vid tidpunkten för hänvisningen. Programkoden måste hantera denna situation på egen hand i enlighet med applikationslogiken. Till exempel kan en rad svaga referenser fungera som en cache för ofta åtkomliga data lagrade på externa media; då innebär otillgängligheten av objektet med en svag länk behovet av att ladda det från disken eller från DBMS och uppdatera, om nödvändigt, posten i cachen.

Användningssättet för svaga referenser bestäms av uppgiften. En vanlig praxis är att i samlingar lagra svaga referenser till objekt som bara behövs så länge som applikationen använder dessa objekt. När ett objekt inte längre behövs och de starka referenserna till det tas bort, hindrar inte de svaga referenserna som lagras i samlingen att objektet tas bort från minnet, vilket eliminerar behovet av att explicit ta bort dem från samlingen.

En egenskap hos klassen SoftReference i Java är att när ett objekt tas bort tar sopsamlaren hänsyn till frekvensen för åtkomst till det genom denna referens, vilket kan vara användbart för att implementera cachning av data som finns till exempel på externa enheter - cachen samlingen håller automatiskt de objekt som nås oftare längre.

För att förhindra att svaga referenser till objekt som inte längre finns förorenar minnet, tillhandahåller systembibliotek mekanismer för att ta hänsyn till sådana referenser. En variant av denna mekanism är länkköer  - speciella objekt som skickas till hänvisaren vid skapandet. När sopsamlaren förstör objektet som refereras av en svag referens, placerar den en referens till motsvarande referens i den tidigare godkända referenskön. Således är listan över referenser som innehåller "döda" länkar tillgänglig för programmet, och det kan radera dem när som helst.

Länkar