java 的四种引用
1. 强引用
使用 new 关键字生成对象 A a = new A()
就属于强引用。一个对象具有强引用,垃圾回收器绝不会回收它。当内存空间不足时,JVM 宁愿抛出 OOM,终止程序,也不会回收强引用的对象。
2. 软引用
如果一个对象具有软引用,内存空间不足时,就会回收这些软引用对象。内存足够时,则不会回收。可用于实现内存敏感的高速缓存。
可以和一个引用队列一起使用,如果软引用对象被垃圾回收器回收,JVM 就会把这个软引用对象加入到队列中。
Object o = new Object();
ReferenceQueue<Object> queue = new ReferenceQueue<>();
SoftReference<Object> softReference = new SoftReference<Object>(o,queue);
3. 弱引用
垃圾回收器扫描内存时,一旦发现有弱引用对象,不管内存是否充足,直接回收。弱引用对象生命周期十分短暂。
可以和一个引用队列一起使用,如果软引用对象被垃圾回收器回收,JVM 就会把这个软引用对象加入到队列中。
Object o = new Object();
ReferenceQueue<Object> queue = new ReferenceQueue<>();
WeakReference<Object> weakReference = new WeakReference<>(o, queue);
4. 虚引用
形同虚设的引用。虚引用不会决定对象的生命周期,一个虚引用对象在任何时候都可能被垃圾回收器回收。虚引用必须和一个引用队列一起使用,在回收之前加入到队列中。用于跟踪垃圾回收, 通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收,可以在回收之前对对象做一些清理工作。
Object o = new Object();
ReferenceQueue<Object> queue = new ReferenceQueue<>();
PhantomReference<Object> reference = new PhantomReference<>(o,queue);
用Java实现一个线程安全且高效的单例模式
public class Singleton {
private Singleton() {
}
public static Singleton getInstance() {
return SingletonLoader.INSTANCE;
}
private static class SingletonLoader {
private static final Singleton INSTANCE = new Singleton();
}
}
利用静态内部类和类加载器的机制,只会构造一个实例,而且是懒加载的。JVM 本身的机制保证了线程安全,读取实例的时候不会进行同步,没有性能缺陷,不依赖 jdk 版本,全版本通用。
网友评论