вівторок, 31 серпня 2010 р.

Reference types in Java

Окрім знайомих всім "сильних" посилань в Java доступними є "слабкі" посилання, які не гарантують того що об"єкт на який вказує мописаляння досі існує. Посилання в Java наслідуються від абстрактного
java.lang.ref.Reference
У стандартній "поставці" доступними є три типи слабких посилань: Soft, Weak, Phantom.
Давайте розглянемо їх детальніше. Строге посилання це усім звичне стандартне посилання на об"єкт:
Quote quote = new Quote();
Quote strongReference = new Quote();
маємо два посилання на один об"єкт в кучі, і це об"єкт не буде зібраний збірником сміття доти, доки досяжними є хоч одне з написаних нами посилань.
Інша ситуація з "слабкими" посиланнями.
Розглянемо детальніше SoftReference:
Quote quote = new Quote();
SoftReference softQuote = new SoftReference(new Quote());
У цьому випадку життя об"єкта гарантуєтсья лише першим "сильним" посиланням. Якщо він стає недоступним, то... то це ще не означає, що об"єкт буде зібраний GC. GC забере об"єкт в той момент, коли "він" вирішить, що пам"яті недостатньо. Тобто, файтично момент смерті об"єкту передбачити неможливо. Ця особливість корисна для організації різноманітних кешів об"єктів.
WeakReference:
Quote quote = new Quote();
WeakReference softQuote = new WeakReference(new Quote());
є корисними, коли ми хоче, щоб життя об"єкту залежило від одного сильного посилання. Щойно воно стає недоступним. як наступний запуск GC збере його.

PhantomReference:
Quote quote = new Quote();
PhantomReference softQuote = new PhantomReference(new Quote());
Найбільш слабкими посиланнями з існуючих є звісно PhantomReference, для яких PhantomReference.get() завжди повертає null. Фантомні референси символізують об"єкт для якого вже був викликаний finilaze, але він ще не зібраний GC. Їх практична складова знаходиться під сумнівом. У статті http://www.javaspecialists.co.za/archive/Issue098.html розглядаєть створення власного кастомного типу посилань та його використання.