第8周

作者: from0 | 来源:发表于2018-01-07 17:14 被阅读6次

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

    相关文章

      网友评论

          本文标题:第8周

          本文链接:https://www.haomeiwen.com/subject/fpixnxtx.html