Svagt led

I programmering er en svag reference en specifik type reference til dynamisk oprettede  objekter i systemer med affaldsopsamling eller referencetælling . Den adskiller sig fra stærke referencer ved, at skraldemanden ikke tager hensyn til forholdet mellem referencen og genstanden på dyngen , når den identificerer genstande, der skal slettes. En svag reference giver dig således mulighed for at arbejde med et objekt som en stærk reference, men om nødvendigt vil objektet blive slettet, selvom der er en svag reference til det. Almindelige referencer omtales nogle gange som "stærke" referencer i forbindelse med affaldsindsamling.

Indholdet af konceptet

Konceptet med en svag reference findes i systemer og programmeringssprog, hvor affaldsindsamling er understøttet - automatisk fjernelse fra hukommelsen af ​​objekter, hvis brug er ophørt og ikke længere vil blive genoptaget. For at bestemme de objekter, der er genstand for affaldsindsamling, bruges en eller anden version af nåbarhedsalgoritmen - et objekt anses for tilgængeligt, hvis der er mindst én reference i programmet. Når der ikke er en eneste reference til et objekt tilbage i programmet, det vil sige, at brugen af ​​objektet er ophørt, kan et sådant objekt slettes på det næste passende tidspunkt.

Den beskrevne mekanisme til frigørelse af hukommelse kan i nogle tilfælde generere hukommelseslækager på grund af "glemte" referencer, når referencer til oprettede objekter er lagret flere steder, og når objektet ikke længere bruges, sletter programmøren ikke dem alle. For at undgå problemer er programmøren tvunget til at overholde en ret stiv disciplin i brugen af ​​links, hvilket ikke altid er praktisk.

For at undgå problemer som dette kan et programmeringssprog eller miljø understøtte såkaldte svage referencer . Sådanne referencer bruges på samme måde som almindelige referencer, men påvirker ikke affaldsindsamlingen, da de ikke tages i betragtning af referencetællemekanismen, og det objekt, som sådanne referencer eksisterer til, kan slettes, medmindre der er almindelige referencer til det (som i denne sammenhæng kan omtales som "stærke links").

Implementering og brug

I de nu almindelige affaldssamlede programmeringssprog, Java og C# , understøttes svage referencer på niveau med systembiblioteker. I Java tjener klasserne java.lang.ref.WeakReference og til dette java.lang.ref.SoftReference, i C# tjener System.WeakReference.

Proceduren for at bruge svage referencer er grundlæggende den samme i alle systemer.

  1. Når det er påkrævet at gemme en svag reference, oprettes et referrer-objekt (en instans af klassen WeakReference), som videregives en normal ("stærk") reference til målobjektet. Den beståede stærke reference frigives øjeblikkeligt, og henviseren gemmer en kopi af den i en form, der ikke kan forhindre skraldeopsamleren i at slette det tilsvarende objekt. Selve henvisningen gemmes som et almindeligt objekt, det vil sige, at der skal gemmes et almindeligt, "stærkt" link til det.
  2. Når det er påkrævet at bruge en svag reference, kaldes en metode get()(i C#, en egenskab Target) på referrer, som opretter og returnerer en stærk reference til objektet, hvis det stadig eksisterer, eller en null pointer null ( nil), hvis objektet har allerede er blevet samlet affald.
  3. Hvis referenten returnerede en gyldig reference, bruges den til at få adgang til objektet på normal vis. Da get()det returnerer en stærk reference, vil objektet ikke blive slettet under dets brug. Når dets brug er fuldført, bliver det objekt, som referenten henviser til, tilgængeligt til affaldsindsamling igen. Det vil sige, at hvis det stærke link modtaget fra referrer er blevet slettet, for en ny brug af objektet, er det nødvendigt at få et nyt link fra referrer og kontrollere det for lighed med en null pointer.
  4. Hvis refereren returnerede en nul-pointer , betyder det, at objektet allerede er blevet fjernet af skraldeopsamleren på tidspunktet for henvisningen. Programkoden skal håndtere denne situation på egen hånd i overensstemmelse med applikationslogikken. For eksempel kan en række svage referencer fungere som en cache for ofte tilgåede data gemt på eksterne medier; så betyder, at objektets utilgængelighed med et svagt led, behovet for at indlæse det fra disken eller fra DBMS og om nødvendigt opdatere posten i cachen.

Brugsmåden for svage referencer bestemmes af opgaven. En almindelig praksis er at gemme svage referencer til objekter i samlinger , som kun er nødvendige, så længe applikationen bruger disse objekter. Når et objekt ikke længere er nødvendigt, og de stærke referencer til det fjernes, forhindrer de svage referencer, der er gemt i samlingen, ikke objektet i at blive fjernet fra hukommelsen, hvilket eliminerer behovet for eksplicit at fjerne dem fra samlingen.

Et træk ved SoftReference-klassen i Java er, at skraldeopsamleren, når du sletter et objekt, tager højde for hyppigheden af ​​at få adgang til det gennem denne reference, hvilket kan være nyttigt til implementering af caching af data , der for eksempel er placeret på eksterne enheder - cachen samling holder automatisk de objekter, der er tilgået oftere, længere.

For at forhindre svage referencer til objekter, der ikke længere eksisterer, fra at forurene hukommelsen, tilbyder systembiblioteker mekanismer til at tage højde for sådanne referencer. En variant af denne mekanisme er linkkøer  - specielle objekter, der sendes til refereren ved oprettelse. Når garbage collector ødelægger det objekt, der refereres til af en svag reference, placerer den en reference til den tilsvarende referrer i den tidligere beståede referencekø. Således er listen over henvisninger, der indeholder "døde" links, tilgængelig for programmet, og det kan slette dem på ethvert passende tidspunkt.

Links