Jaké druhy odkazů existují v Javě a jaké jsou jejich vlastnosti?
sobes.tech AI
Odpověď od AI
V jazyce Java existují tři hlavní typy odkazů (referenčních proměnných), které se liší chováním sběrače odpadu:
- Silný odkaz (Strong Reference)
- Měkký odkaz (Soft Reference)
- Slabý odkaz (Weak Reference)
- Fantomový odkaz (Phantom Reference)
Silný odkaz (Strong Reference)
Toto je nejběžnější typ odkazu. Objekt, na který odkazuje silný odkaz, nebude sběračem odpadu odstraněn, dokud na něj existuje alespoň jeden silný odkaz.
// Vytvoření objektu a silného odkazu na něj
Object myObject = new Object();
Měkký odkaz (Soft Reference)
Měkký odkaz ukazuje na objekt, který může být odstraněn sběračem odpadu, pokud JVM potřebuje paměť. Objekty, na které odkazují pouze měkké odkazy, jsou garantovaně nesmazatelné, dokud není nutné uvolnit paměť. Obvykle se používá pro kešování.
import java.lang.ref.SoftReference;
// Vytvoření objektu
Object data = new Object();
// Vytvoření měkkého odkazu na objekt
SoftReference<Object> softRef = new SoftReference<>(data);
// Objekt data může být odstraněn sběračem odpadu, pokud je málo paměti
// Pokud objekt nebyl odstraněn, lze k němu znovu přistoupit
Object retrievedData = softRef.get();
Slabý odkaz (Weak Reference)
Slabý odkaz ukazuje na objekt, který může být odstraněn sběračem odpadu kdykoliv, pokud na něj nezbývá žádný silný odkaz. Často se používá pro implementaci kešů, kde mohou být prvky odstraněny při nedostatku paměti.
import java.lang.ref.WeakReference;
// Vytvoření objektu
Object cacheEntry = new Object();
// Vytvoření slabého odkazu na objekt
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry);
// Objekt cacheEntry může být odstraněn sběračem odpadu kdykoliv
// Kontrola, zda byl objekt odstraněn
if (weakRef.get() == null) {
// Objekt byl odstraněn
}
Fantomový odkaz (Phantom Reference)
Fantomový odkaz se používá ve spojení s ReferenceQueue k provádění akcí před úplným odstraněním objektu z paměti. get() vždy vrací null.
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
// Vytvoření sledovaného objektu
Object resource = new Object();
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
// Vytvoření fantomového odkazu a jeho spojení s frontou
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue);
// V samostatném vlákně lze sledovat frontu
// Když je objekt resource připraven k úplnému odstranění, objeví se ve frontě
Vlastnosti a srovnání:
| Typ odkazu | Sběrač odpadu | Získání objektu přes get() |
Použití |
|---|---|---|---|
| Silný odkaz | Ne | Ano | Obvyklé použití |
| Měkký odkaz | Může být | Ano (pokud není odstraněn) | Kešování (při nedostatku paměti) |
| Slabý odkaz | Může být | Ano (pokud není odstraněn) | Kešování (pokud nejsou žádné silné odkazy) |
| Fantomový odkaz | Může být | Ne (vždy null) | Čištění zdrojů před odstraněním (s ReferenceQueue) |