第8周

2018-01-07  本文已影响6人  from0

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 版本,全版本通用。

上一篇 下一篇

猜你喜欢

热点阅读