Sobes.tech
Middle

Aké druhy odkazov existujú v Jave a aké sú ich vlastnosti?

sobes.tech AI

Odpoveď od AI

V Jave existujú tri hlavné typy odkazov (referenčných premenných), ktoré sa líšia správaním zberača odpadu:

  • Silný odkaz (Strong Reference)
  • Mäkký odkaz (Soft Reference)
  • Slabý odkaz (Weak Reference)
  • Fantomový odkaz (Phantom Reference)

Silný odkaz (Strong Reference)

Toto je najbežnejší typ odkazu. Objekt, na ktorý ukazuje silný odkaz, nebude zozbieraný zberačom odpadu, pokiaľ naň existuje aspoň jeden silný odkaz.

// Vytvorenie objektu a silného odkazu naň
Object myObject = new Object(); 

Mäkký odkaz (Soft Reference)

Mäkký odkaz ukazuje na objekt, ktorý môže byť zozbieraný zberačom odpadu, ak JVM potrebuje pamäť. Objekt, na ktorý ukazujú len mäkké odkazy, je garantovane nedostupný pre zberač, kým sa neuvoľní pamäť. Zvyčajne sa používa na kešovanie.

import java.lang.ref.SoftReference;

// Vytvorenie objektu
Object data = new Object(); 
// Vytvorenie mäkkej referencie na objekt
SoftReference<Object> softRef = new SoftReference<>(data); 

// Objekt data môže byť zozbieraný, ak je pamäť nedostatočná
// Ak objekt nebol zozbieraný, je možné k nemu opäť pristúpiť
Object retrievedData = softRef.get(); 

Slabý odkaz (Weak Reference)

Slabý odkaz ukazuje na objekt, ktorý môže byť zozbieraný zberačom odpadu kedykoľvek, ak naň nezostali žiadne silné odkazy. Často sa používa na implementáciu kešov, kde môžu byť prvky odstránené pri nedostatku pamäti.

import java.lang.ref.WeakReference;

// Vytvorenie objektu
Object cacheEntry = new Object(); 
// Vytvorenie slabého odkazu na objekt
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry); 

// Objekt cacheEntry môže byť zozbieraný kedykoľvek
// Kontrola, či bol objekt zozbieraný
if (weakRef.get() == null) { 
    // Objekt bol zozbieraný
}

Fantomový odkaz (Phantom Reference)

Fantomová referencia sa používa v spojení s ReferenceQueue na vykonávanie akcií pred úplným odstránením objektu z pamäte. get() vždy vracia null.

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

// Vytvorenie sledovaného objektu
Object resource = new Object(); 
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>(); 
// Vytvorenie fantomovej referencie a jej spojenie s frontou
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue); 

// V samostatnom vlákne môžete sledovať frontu
// Keď je objekt resource pripravený na úplné odstránenie, objaví sa vo fronte

Vlastnosti a porovnanie:

Typ odkazu Sberač odpadu Získanie objektu cez get() Použitie
Silný odkaz Nie Áno Bežné použitie
Mäkký odkaz Môže byť Áno (ak nie je zozbieraný) Kešovanie (pri nedostatku pamäti)
Slabý odkaz Môže byť Áno (ak nie je zozbieraný) Kešovanie (ak nie sú žiadne silné odkazy)
Fantomový odkaz Môže byť Nie (vždy null) Čistenie zdrojov pred odstránením (s ReferenceQueue)