SORU
25 Temmuz 2010, Pazar


Anlama'Referans sınıflar s Java: SoftReference, WeakReference ve PhantomReference

Biri üç Referans sınıflar arasındaki fark (ya da güzel bir açıklama için bir bağlantı sonrası)açıklayabilir? SoftReference >WeakReference >PhantomReference, ama ne zaman her birini kullanmalıyım? Neden ama SoftHashMap PhantomHashMap WeakHashMap var mı?

Ve eğer aşağıdaki kodu kullanıyorum

WeakReference<String> ref = new WeakReference<String>("Hello!");
if (ref != null) {                 // ref can get collected at any time...
    System.gc();                   // Let's assume ref gets collected here.
    System.out.println(ref.get()); // Now what?!
}

...ne olur? Eğer ref önce boş olduğunu kontrol etmek için her deyimi (bu yanlış, ama ne yaparımgerekirBence öyle)? Hızlı-ateş soru için özür dilerim, ama sorun Reference bu dersleri anlamakta güçlük çekiyorum... Teşekkürler!

CEVAP
25 Temmuz 2010, Pazar


Java kütüphanesi documentation for the java.lang.ref package üç açık referans türleri azalan gücünü karakterize.

Başvurulan nesne ana bilgisayar işlemi için bellek yetersiz kadar hayatta kalmak istediğinizde SoftReference kullanın. Nesne toplayıcısı kadar toplama için uygun olmayacaktırihtiyacı varbelleği boşaltmak için. Gevşek bir şekilde ifade etti, SoftReference aracı bağlama, duruma gelene kadar "nesne artık." Pın

Buna karşılık, başvurulan nesnenin ömür boyu etkilemek istemediğin zaman WeakReference kullanın; eğer sadece ayrı bir onaylama işlemi yapmak istiyorumhakkındabaşvurulan bir nesne, canlı kaldığı sürece. Nesneye bağlı varlığı etkilenmez koleksiyonu için uygunluk WeakReferenceler. Sanki bir dış eşleme nesne örneği ile ilgili mülkiyet, mülk gereken tek kaydı olarak ilgili nesne hayatta, iyi bir kullanım için WeakReferences WeakHashMap.

Karakterize etmek için bir—PhantomReference—son daha zor. WeakReference, PhantomReference böyle bir sınır başvurulan nesnenin ömrü üzerinde hiç bir etkisi oluyor gibi. Ama diğer başvuru türleri farklı, hatta PhantomReference bir başvuru yapabilirsiniz. Bir anlamda, için, arayanlar, bildiğimiz işaret ettiği şeye işaret etmez. Sadece bir sonraki kontrol edilebilir başvurulan nesne -- verileri ile ilgili bazı verileri ilişkilendirmek için izin verir ve PhantomReference ReferenceQueue ilgili sıraya geldiğinde üzerine harekete geçti. Normalde PhantomReference bir tür türemiş ve türetilmiş yazın bazı ek veri içerir. Ne yazık ki, bazı downcasting böyle türetilmiş bir tür kullanmak için var.

Örnek kodunuzda ref başvuru değil (veya eğer tercih ederseniz, "") değeri boş olabilir. Bunun yerine, değeri boş olabilir Reference#get() çağırarak elde değil. Null olması bulunursa, çok geç kaldın; başvurulan bir nesne zaten toplanmış olma yolunda

final String val = ref.get();
if (null != val)
{
  // "val" is now pinned strongly.
}
else
{
  // "val" is already ready to be collected.
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • boburnham

    boburnham

    11 Temmuz 2006
  • CruzerLite

    CruzerLite

    1 EKİM 2011
  • Helen Bradley

    Helen Bradle

    4 Mart 2008