Sobes.tech
Middle

Какви видове препратки съществуват в Java и какви са техните особености?

sobes.tech AI

Отговор от AI

В Java съществуват три основни типа референции (променливи за референции), които се различават по поведението си спрямо събирача на отпадъци:

  • Силна референция (Strong Reference)
  • Мека референция (Soft Reference)
  • Слаба референция (Weak Reference)
  • Фантомна референция (Phantom Reference)

Силна референция (Strong Reference)

Това е най-често срещаният тип референция. Обектът, към който сочи силната референция, няма да бъде събран от събирача на отпадъци, докато съществува поне една силна референция към него.

// Създаване на обект и силна референция към него
Object myObject = new Object(); 

Мека референция (Soft Reference)

Меката референция сочи към обект, който може да бъде събран от събирача на отпадъци, ако JVM има нужда от памет. Обектите, към които сочат само меки референции, са гарантирано недостъпни за събирача, докато не се освободи памет. Обикновено се използва за кеширане.

import java.lang.ref.SoftReference;

// Създаване на обект
Object data = new Object(); 
// Създаване на мека референция към обекта
SoftReference<Object> softRef = new SoftReference<>(data); 

// Обектът data може да бъде събран, ако паметта е недостатъчна
// Ако обектът не е събран, може да се получи отново
Object retrievedData = softRef.get(); 

Слаба референция (Weak Reference)

Слабата референция сочи към обект, който може да бъде събран от събирача на отпадъци по всяко време, ако към него няма други силни референции. Често се използва за реализиране на кешове, където елементите могат да бъдат изхвърлени при недостиг на памет.

import java.lang.ref.WeakReference;

// Създаване на обект
Object cacheEntry = new Object(); 
// Създаване на слаба референция към обекта
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry); 

// Обектът cacheEntry може да бъде събран по всяко време
// Проверка дали е бил събран
if (weakRef.get() == null) { 
    // Обектът е бил събран
}

Фантомна референция (Phantom Reference)

Фантомната референция се използва в съчетание с ReferenceQueue за изпълнение на действия преди обектът да бъде напълно изтрит от паметта. get() винаги връща null.

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

// Създаване на обект за наблюдение
Object resource = new Object(); 
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>(); 
// Създаване на фантомна референция и свързването й с опашката
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue); 

// В отделен поток може да се наблюдава опашката
// Когато обектът resource е готов за окончателно изтриване, фантомната референция ще се появи в опашката

Характеристики и сравнение:

Тип референция Събирач на отпадъци Получаване на обекта чрез get() Използване
Силна референция Не Да Обичайна употреба
Мека референция Може да събира Да (ако не е събран) Кеширане (при недостиг на памет)
Слаба референция Може да събира Да (ако не е събран) Кеширане (ако няма силни референции)
Фантомна референция Може да събира Не (винаги null) Почистване на ресурси преди изтриване (с ReferenceQueue)