Sobes.tech
Middle

Milyen típusú hivatkozások léteznek Java-ban, és milyen jellemzőik vannak?

sobes.tech MI

Válasz az MI-től

A Java-ban három fő hivat típus létezik (referenciam változók), amelyek a szemétgyűjtő viselkedésében különböznek:

  • Erős Hivatkozás (Strong Reference)
  • Puha Hivatkozás (Soft Reference)
  • Gyenge Hivatkozás (Weak Reference)
  • Fantom Hivatkozás (Phantom Reference)

Erős Hivatkozás (Strong Reference)

Ez a leggyakoribb hivatkozási típus. Az objektum, amelyre erős hivatkozás mutat, nem lesz összegyűjtve a szemétgyűjtő által, amíg legalább egy erős hivatkozás mutat rá.

// Objektum létrehozása és erős hivatkozás rá
Object myObject = new Object(); 

Puha Hivatkozás (Soft Reference)

Puha hivatkozás egy olyan objektumra mutat, amelyet a JVM szükség esetén összegyűjthet. Azokat az objektumokat, amelyek csak puha hivatkozásokkal rendelkeznek, garantáltan nem gyűjti össze a szemétgyűjtő, amíg a memória nem szűkös. Általában gyorsítótárazásra használják.

import java.lang.ref.SoftReference;

// Objektum létrehozása
Object data = new Object(); 
// Puha hivatkozás létrehozása
SoftReference<Object> softRef = new SoftReference<>(data); 

// Az adat összegyűjthető, ha a memória kevés
// Ha az objektum nem gyűjtött össze, vissza lehet szerezni
Object retrievedData = softRef.get(); 

Gyenge Hivatkozás (Weak Reference)

Gyenge hivatkozás egy olyan objektumra mutat, amelyet a szemétgyűjtő bármikor összegyűjthet, ha nincs más erős hivatkozás rá. Gyakran cache-ként használják.

import java.lang.ref.WeakReference;

// Objektum létrehozása
Object cacheEntry = new Object(); 
// Gyenge hivatkozás létrehozása
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry); 

// Az objektum összegyűjthető bármikor
// Ellenőrzés, hogy az objektum összegyűjtött-e
if (weakRef.get() == null) { 
    // Az objektum összegyűjtött
}

Fantom Hivatkozás (Phantom Reference)

A fantom hivatkozás a ReferenceQueue-val együtt használható, az objektum teljes törlése előtt végrehajtandó műveletekhez. A get() mindig null-t ad.

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

// Figyelni kívánt objektum létrehozása
Object resource = new Object(); 
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>(); 
// Fantom hivatkozás létrehozása és kötése a sorhoz
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue); 

// Egy külön szálon figyelheti a sorokat
// Amikor az objektum készen áll a végső törlésre, a fantom hivatkozás megjelenik a sorban

Jellemzők és összehasonlítás:

Hivat típus Gyűjtő get()-el elérhető objektum Használat
Erős Hivatkozás Nem Igen Szokásos használat
Puha Hivatkozás Lehet Igen (ha nem gyűjtötték össze) Gyorsítótár (memória szűkössége esetén)
Gyenge Hivatkozás Lehet Igen (ha nem gyűjtötték össze) Gyorsítótár (ha nincsenek erős hivatkozások)
Fantom Hivatkozás Lehet Nem (mindig null) Erőforrások tisztítása a ReferenceQueue-val