Kādas ir Java saites un kādas ir to īpašības?
sobes.tech AI
Atbilde no AI
Java ir pastāv trīs galvenie atsauces veidi (atsauces mainīgie), kas atšķiras pēc atkritumu savācēja uzvedības:
- Stipra Atsauce (Strong Reference)
- Mīksta Atsauce (Soft Reference)
- Vāja Atsauce (Weak Reference)
- Fantom Atsauce (Phantom Reference)
Stipra Atsauce (Strong Reference)
Tas ir visbiežāk sastopamais atsauces veids. Objekts, uz kuru norāda stipra atsauce, netiks savākts, kamēr pastāvēs vismaz viena stipra atsauce uz to.
// Objekta izveide un stipras atsauces piešķiršana
Object myObject = new Object();
Mīksta Atsauce (Soft Reference)
Mīksta atsauce norāda uz objektu, kas var tikt savākts, ja JVM tam nepieciešama atmiņa. Objekti, uz kuriem norāda tikai mīkstas atsauces, garantēti netiks savākti, kamēr JVM nav nepieciešams atbrīvot atmiņu. Parasti izmanto kešatmiņās.
import java.lang.ref.SoftReference;
// Objekta izveide
Object data = new Object();
// Mīkstas atsauces izveide
SoftReference<Object> softRef = new SoftReference<>(data);
// Ja atmiņa trūkst, objekts var tikt savākts
// Ja objekts nav savākts, to var atgūt atpakaļ
Object retrievedData = softRef.get();
Vāja Atsauce (Weak Reference)
Vāja atsauce norāda uz objektu, kas var tikt savākts jebkurā laikā, ja uz to nav stipru atsauču. Bieži izmanto kešatmiņu realizācijā, kur elementi var tikt izņemti, ja trūkst atmiņas.
import java.lang.ref.WeakReference;
// Objekta izveide
Object cacheEntry = new Object();
// Vājas atsauces izveide
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry);
// Objekts `cacheEntry` var tikt savākts jebkurā laikā
// Pārbaude, vai objekts ir savākts
if (weakRef.get() == null) {
// Objekts ir savākts
}
Fantom Atsauce (Phantom Reference)
Fantom atsauce tiek izmantota kopā ar ReferenceQueue, lai veiktu darbības pirms objekts tiek pilnībā izņemts no atmiņas. Saņemt objektu caur fantom atsauci nav iespējams (get() vienmēr atgriež null). To galvenokārt izmanto resursu pārvaldībai, kas prasa īpašu tīrīšanu.
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
// Objekta izveide uzraudzībai
Object resource = new Object();
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
// Fantomās atsauces izveide un sasaistīšana ar rindu
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue);
// Atsevišķā plūsmā var uzraudzīt referenceQueue
// Kad objekts resource būs gatavs galīgai izņemšanai, fantomās atsauce parādīsies rindā
Īpatnības un salīdzinājums:
| Atsauces veids | Savācējs | Saņem objektu caur get() |
Lietojums |
|---|---|---|---|
| Stipra Atsauce | Nav savākšanas | Jā | Parasta lietošana |
| Mīksta Atsauce | Var savākt | Jā (ja nav savākta) | Kešatmiņa (ja trūkst atmiņas) |
| Vāja Atsauce | Var savākt | Jā (ja nav savākta) | Kešatmiņa (ja nav stipru atsauču) |
| Fantom Atsauce | Var savākt | Nē (vienmēr null) | Resursu tīrīšana pirms izņemšanas (ar ReferenceQueue) |