java 的四種引用
1. 強引用
使用 new 關(guān)鍵字生成對象 A a = new A()
就屬于強引用丈咐。一個對象具有強引用,垃圾回收器絕不會回收它母赵。當(dāng)內(nèi)存空間不足時眼溶,JVM 寧愿拋出 OOM,終止程序幅疼,也不會回收強引用的對象饥侵。
2. 軟引用
如果一個對象具有軟引用,內(nèi)存空間不足時衣屏,就會回收這些軟引用對象躏升。內(nèi)存足夠時,則不會回收狼忱∨蚴瑁可用于實現(xiàn)內(nèi)存敏感的高速緩存。
可以和一個引用隊列一起使用钻弄,如果軟引用對象被垃圾回收器回收佃却,JVM 就會把這個軟引用對象加入到隊列中。
Object o = new Object();
ReferenceQueue<Object> queue = new ReferenceQueue<>();
SoftReference<Object> softReference = new SoftReference<Object>(o,queue);
3. 弱引用
垃圾回收器掃描內(nèi)存時窘俺,一旦發(fā)現(xiàn)有弱引用對象饲帅,不管內(nèi)存是否充足,直接回收瘤泪。弱引用對象生命周期十分短暫灶泵。
可以和一個引用隊列一起使用,如果軟引用對象被垃圾回收器回收对途,JVM 就會把這個軟引用對象加入到隊列中赦邻。
Object o = new Object();
ReferenceQueue<Object> queue = new ReferenceQueue<>();
WeakReference<Object> weakReference = new WeakReference<>(o, queue);
4. 虛引用
形同虛設(shè)的引用。虛引用不會決定對象的生命周期实檀,一個虛引用對象在任何時候都可能被垃圾回收器回收惶洲。虛引用必須和一個引用隊列一起使用按声,在回收之前加入到隊列中。用于跟蹤垃圾回收, 通過判斷引用隊列中是否已經(jīng)加入了虛引用恬吕,來了解被引用的對象是否將要被垃圾回收签则,可以在回收之前對對象做一些清理工作。
Object o = new Object();
ReferenceQueue<Object> queue = new ReferenceQueue<>();
PhantomReference<Object> reference = new PhantomReference<>(o,queue);
用Java實現(xiàn)一個線程安全且高效的單例模式
public class Singleton {
private Singleton() {
}
public static Singleton getInstance() {
return SingletonLoader.INSTANCE;
}
private static class SingletonLoader {
private static final Singleton INSTANCE = new Singleton();
}
}
利用靜態(tài)內(nèi)部類和類加載器的機制铐料,只會構(gòu)造一個實例怀愧,而且是懶加載的。JVM 本身的機制保證了線程安全余赢,讀取實例的時候不會進行同步芯义,沒有性能缺陷,不依賴 jdk 版本妻柒,全版本通用扛拨。