SoftReference的語義就是當(dāng)內(nèi)存不夠用的時(shí)候,GC會(huì)回收SoftReference所引用的對(duì)象。所以,在memory sensitive的程序中將某些大型數(shù)據(jù)設(shè)置成SoftReference再合適不過了。
創(chuàng)建一個(gè)SoftReference:
Object obj = new Object(); SoftReference softRef = new SoftReference(obj); obj = null;
最后那句“obj = null”很重要。如果不將obj設(shè)置成null,那么new出來的Object就會(huì)有一個(gè)"strong reference",如果這樣,softRef就不能發(fā)揮作用了。
使用SoftReferene:
Object obj2; obj2 = sr.get(); if (obj2 == null) // GC freed this sr = new SoftReference(obj2 = new Object());
因?yàn)槭荢oftReference,所以有可能已經(jīng)被GC回收了,所以需要判斷sr.get()的返回值是否為null。如果是的話,就再重新new一個(gè)Object。這里的最后一行代碼也很有講究,比如,也許會(huì)這么寫:
Object obj2; obj2 = sr.get(); if (obj2 == null) { sr = new SoftReference(new Object()); obj2 = sr.get(); }
這樣的問題就在于GC可能發(fā)生在"sr = new SoftReference(new Object());"和"obj2 = sr.get()"之間,那么obj2仍然有可能為null。
聯(lián)系客服